apply()和call()和bind()用法
共同作用:借用别人的方法来调用,就像调用自己一样.
在非严格模式下当我们第一个参数传递null或undefined是,函数体内的this会指向默认的宿主对象.
区别:唯一的区别只有接受参数的方式不同.
call()方法:定义 : 调用一个对象的一个方法,一另一个对象替换当前对象.
语法 : Function.call(obj,arg1,arg2,…)
apply()方法:
定义 : 应用某一对象的一个方法,用另一个对象替换当前对象.
语法 : Function.apply(obj,args)
obj : 这个对象将代替Function类里面的this对象.
args : 这是是数组或类数组,apply方法把这个集合中的元素作为参数传递给调用的函数.
用一个简单的公式总结:
1 | fn.call(obj,arg1,arg2) == fn.apply(obj,arguments) == fn.apply(obj,[arg1,arg2]) == this.fn(arg1,arg2) |
举例
1 | function Sister() |
它输出的是 Age:25,其实到这里我还很迷糊,下面这一个断点调试才让我明白,
我在第26行打了断点,然后单步了一步.
sis.sayAge.call(bro)调用的方法确实是Sister中的方法,但是其中的this(上下文)却变成了Brother.用文档中的解释就是:只有这个sayAge是sis对象的,其执行环境却是bro的.
简而言之:sis.sayAge.call(bro)意思就是,单单将sis的sayAge移动到bro对象中来执行.
ps:要是我设计的js,我就规定这么写:sis.sayAge.in(bro)
bind()方法:call和apply都是对函数的直接调用,但是bind方法返回的仍然是一个函数.所以后面还需要()
来进行调用.
传参:
可以像call方法那样传参.
1 | sis.sayAge.bin(bro,'老子今年27');//注意这里不会调用执行函数 |
由于bind返回的仍然是一个函数,所以还可以在调用的时候传参数.
1 | sis.sayAge.bin(bro)('老子今年27'); |