关于javascript,绑定丢失问题

偶尔看到一篇大佬写的js中this绑定的文章,受益匪浅
就是又一个问题一直百思不得其解,望各位大佬指点

文章中讲显式绑定不能解决隐式绑定丢失问题,我试了下

    
    function fn(){
        console.log(this.a)
    }
    var obj = {
        a : 1,
        fn : fn
    };
    var bar  = obj.fn;
    bar() //undefined
    bar.call(obj) //1
    

这样的运行结果的话,为什么不能解决呢 ?望各位大佬不吝赐教,谢谢

阅读 3k
3 个回答

bar() 函数的调用者是window window上面并没有 a属性,所以是undefine。 而第二个由于call 改变了this的指向,所以这个时候this.a的指向 就是obj对象 所以就相当于 obj.bar()

不知您是否还有这个问题
显示绑定:使用call,apply的话,在使用回调函数的情况中会出现违背预期的结果。因为call,apply都会立即执行。
而硬绑定bind则不会立即执行。符合我们对回调函数执行的要求
您试一下这个代码

function foo() {
  console.log( this.a );
}
var obj = {
  a: 2,
  foo: foo,
};
var a = "oops, global"; // a 是全局对象的属性
setTimeout( obj.foo.call(obj), 10000 ); // 立即执行
setTimeout( obj.foo.bind(obj), 10000 ); // timeout后执行

reference:https://juejin.cn/post/700054...

修改:
我去读了一下那本《你不知道的JavaScript》,您看一下这个答案。这是书作者回复的。不要把它想得太复杂
https://github.com/getify/You...

this 是谁,和函数在哪定义的(上级作用域)、在哪执行的(上下文)没有任何关系。
而是,当前函数执行的主体(谁执行的函数this就是谁)。

bar();// 此函数的执行,在非严格模式下是window,在window上没有a属性
bar.call(obj); // call 把当前的执行主体指定为 obj。所以能拿到a属性值
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题