var b = {
dam: 'bdam'
}
var c = {
dam: 'cdam'
}
function ceshi(){
return this.dam;
}
ceshi.bind(b).call(c); // bdam
个人理解中,以上这段代码,bind将ceshi方法所对应的this对象指向b,然后call(c)应该继续将this指向到c上。从而输出结果为cdam。
但是实际的执行结果是bdam,原因是什么?
var b = {
dam: 'bdam'
}
var c = {
dam: 'cdam'
}
function ceshi(){
return this.dam;
}
ceshi.bind(b).call(c); // bdam
个人理解中,以上这段代码,bind将ceshi方法所对应的this对象指向b,然后call(c)应该继续将this指向到c上。从而输出结果为cdam。
但是实际的执行结果是bdam,原因是什么?
我们可以通过模拟的这个bind方法发现,当调用bind方法返回的这个函数就已经不再使用有关了,而是与bind传入的上下文相关。
你通过call方法改变上下文,仅仅是从window换成了c对象
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
一开始我对其输出百思不得其解,所以搜集了关于bind的函数的实现原理:

可以看出,bind返回一个函数,在a.foo.bind(b).call(c),call(c)只是将bind返回的匿名函数 function(){ }的window对象改为c对象,也就是由window.function(){ } 改为 c.function(){ },但是由于闭包,外部依然可以读取bind函数中的局部变量 context,也就是说context参数的值依然是刚开始传入的 b 对象,所以说 bind绑定是永久的
本人拙见~~~