js 中this调用的丢失,方法名调用和方法名()调用有什么区别

var obj = {
  id: 'awesome',
  cool: function coolFn() {
    var _scope = this;
    console.log(_scope.id);
  }
}

var id = 'not awesome';
obj.cool();

 **// 为什么下面这两段调用的结果不一样, this 的指向问题**
// 为什么obj.cool,和obj.cool()有什么不同,结果也是不一样的
setTimeout(obj.cool,100) // not awesome
setTimeout(obj.cool(),100) // awesome 
阅读 2.5k
2 个回答

定时器的第一个参数为一个函数,或一段代码块(如"console.log('a')"),当参数为函数时,函数中的this将指向window,解决:setTimeout(obj.cool.bind(obj),100)或者setTimeout(function(){obj.cool()},100)

至于第二个定时器在读到这句的时候会立即执行obj.cool(),也就是打印一次awesome,然后将字符串awesome作为定时器的第一个参数,这不是一个函数或一段可执行的代码块,所以这个定时器触发的时候会报错

这个是this的隐式绑定和隐式丢失问题。
一般地,被直接对象所包含的函数调用时,也称为方法调用,this隐式绑定到该直接对象;
隐式丢失是指被隐式绑定的函数丢失绑定对象,从而默认绑定到全局对象或者undefined上。
你这是因为参数传递导致了隐式赋值。
可以看看这个文章传送门和小黄书上册85面

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏