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綁定涉及更多知識點,不在這裏寫
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章