1. 参数按值传递
ES中所有函数的参数都是按值传递的,按值传递就是函数外部的值复制给函数的参数
var value = 1
function foo(v){
v = 2
console.log(value)
}
foo(value)
console.log(value)
打印 2 1
手写 call、apply
call的用法
let obj = {
name: "张三"
}
function bar(age,sex){
console.log(this.name+'今年'+age+'岁'+',是个'+sex)
}
bar.call(obj,18,'男')
因为this指向函数的调用者,call就是在执行函数时,将其调用者设定为call中的第一个参数。并且能够传递多个参数。
知道其功能后开始实现call:
Function.prototype.mycall = function(context){
var context = context || window
context.fn = this
let arg = [...arguments].slice(1)
context.fn(...arg)
delete context.fn
}
apply
与calld的区别是apply只能传入2个参数,第一个仍然是绑定对象,第二个是参数
Function.prototype.myApply = function (context, arr){
var context = context || window
context.fn = this
context.fn(...arr)
delete context.fn
}
手写bind
bind的用法,会创建一个新的函数,当新函数被调用时,bind第一个参数this
- 返回一个函数
- 能传入参数,并且参数可以分两次传入
var foo = {
name: 1
}
function bar(age,job){
console.log(`${this.value},${age},${job}`)
}
bar.bind(foo,18)("前端开发工程师")
Function.prototype.mybind = function(context){
let _this = this
let args1 = [...arguments].slice(1)
return function(){
var args2 = [...arguments]
return _this.apply(context,[...args1,...args2])
}
}