this解析

每个函数的this是在调用的时候被绑定的,完全取决于函数的调用位置
表现特征有点像动态作用域,从就近查找调用栈,来判断this指向谁。

1. 默认绑定 (全局环境)

var a = 2;
function foo(){
    console.log(this.a);
}

foo() //2

这个例子中,foo()在全局环境中被裸着调用,毫无上下文。所以这时this被调用的时候从内向外寻找a,可以找到全局变量a。

但是在严格模式(strict mode)中,默认绑定就不生效

var a = 2;
function foo(){
    "use strict"//严格模式

    console.log(this.a);
}

foo() //undefined

2.隐式绑定 (对象环境)

var obj = {
    a: 2,
    foo:foo
}
function foo(){
    console.log(this.a);
}

obj.foo()//2
foo()//undefined

这种绑定并不靠谱,比如在回调的情况下。

function foo(){
    console.log(this.a);
}
var obj = {
    a:2,
    foo:foo
}
setTimeout(obj.foo, 100);//undefined

为什么不靠谱, 在setTimeout时调用,this指向了setTimeout这个函数而不再是obj这个对象。

3.显式绑定(call, apply, bind)

隐式绑定把函数直接绑定到了目标对象的一个属性上。如果我们不想在对象内部包含函数引用,而想直接在某个对象上运用函数。就要用显式绑定。

function sayName(){
    console.log(this.name);
}
sayName(); //直接调用这个函数将找不到this,返回undefine。

person1 = new Person("leo");
//sayName使用call()将this指向person1就好了。
sayName.call(person1);//"leo" 



function sayNameAndMore(age, gender){
    console.log(this.name + age + gender)
}
//apply用法
sayNameAndMore.apply(person1, [" 18 "," male "]);//leo 18 male

共同点

  • 都是被函数调用,如someFunction.call(obj), someFunction.apply(obj)
  • 都将this指向填入的参数obj,someFunction函数定义中的所有this就可以按照想要的效果进行。

区别

  • call和apply直接执行,bind之后执行。
  • call只接受一个参数,而apply接受一个参数数组。

React中的bind

  • React中我们总是要把事件handle函数bind到组件上。是因为事件触发是异步的,如果不bind,触发时的this就是当时的dom元素。就像上面隐式绑定不靠谱的情况一样。

new绑定

  • new绑定涉及更多知识点,不在这里写
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章