js:this

这里写图片描述
这是一道面试题。
加上前些天看了几篇文章,有篇文章讲得不错,拿出来说说。
传送门:http://mp.weixin.qq.com/s/ksqtCd8ouxU-cVc_HnA4Aw


函数调用

函数调用的三种方式

func(a, b);
obj.method(a, b);
func.call(context, a, b);

似乎前两种我们更加频繁地使用,而第三种则不常用到。
但其实,第三种才是函数调用的真正关键所在。也就是说,可以用第三种的写法来替代前两种。
如何替代呢?

func(a, b);
//等价于
func.call(undefined, a, b);
obj.method(a, b);
//等价于
obj.method.call(obj, a, b);

现在来看一段代码

var obj = {
  foo: function(){
    console.log(this)
  }
}

var bar = obj.foo
obj.foo() // 打印出的 this 是 obj
bar() // 打印出的 this 是 window

原因就在于

bar()
//等价于
bar.call(undefined);
obj.foo()
//等价于
obj.foo.call(obj, a, b);

this丢失问题

var bar = obj.foo

你明明想的是this指向的是obj,但是他却指向了window。
这就是this丢失问题。
如何解决?

var bar = obj.foo.bind(obj);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章