這是函式通常的用法,屬於全域性性的呼叫,所以this指向全域性。最簡單的示例
var x = 1;
function test()
test(); // 1
此時,誰呼叫這個函式,函式內部的this就指向誰
var name = 'window';
var test =
}test.getname(); // test
this指向當前例項
var name = 'window';
function test()
}let test = new test();
test.getname(); // test
var test =
}var testcall =
test.getname.call(testcall,'extraparam1','extraparam2');
// testcall extraparam1 extraparam2
這邊可以看到列印出的時testcall物件的name屬性,並且call方法後面攜帶的是乙個引數列表
var test =
}}
var test =
}var testbind =
let getnamebind = test.getname.bind(testbind,'前置引數');
getnamebind('extraparam1'); // testbind 前置引數 extraparam1
test.getname('extraparam1','extraparam2'); // test extraparam1 extraparam2
bind返回乙個新的函式
this.name = 'window';
var test =
}var testcall =
}var testbind =
test.getname(); // window
test.getname.call(testcall); // window
test.getname.bind(testbind)(); // window
this.name = 'window';
var test =
}}var testcall =
}var testbind =
test.getname()(); // test
test.getname.call(testcall)(); // testcall
test.getname.bind(testbind)()(); // testbind
說完以上幾種情況,下面看兩個綜合題
var name = 'window'
var person1 = ,
show2: () => console.log(this.name),
show3: function ()
},show4: function ()
}var person2 =
person1.show1() // person1
person1.show1.call(person2) // person2
person1.show2() // window
person1.show2.call(person2) // window
person1.show3()() // window
person1.show3().call(person2) // person2
person1.show3.call(person2)() // window
person1.show4()() // person1
person1.show4().call(person2) // person1
person1.show4.call(person2)() // person2
第 20 行:show1為普通函式,this指向呼叫物件,這邊是person1呼叫,所以指向person1
第 21 行:使用call將show1函式的指標指向person2
第 23 行:show2函式為箭頭函式,父級作用域為person1作用域即全域性作用域,所以this指向window
地 24 行:箭頭函式的this指向在定義時就已經確定。不隨著call進行修改,所以此處this依舊是指向window
第 26 行:show3 返回乙個函式,然後呼叫這個返回的函式,此行等價於
let show3 = person1.show3();
show3()
屬於第一種情況,函式的直接呼叫,this指向全域性
第 27 行:使用call將show3函式返回的函式的this指向了person2,等價與於
let show3 = person1.show3();
show3.call(person2);
第 28 行:和第 26 行道理一樣,等價於
let show3 = person1.show3.call(person2);
show3();
函式直接呼叫,this指向全域性
第 30 行:show4返回的是乙個箭頭函式,箭頭函式的this是繼承的父級函式show4的this,所以此處箭頭函式的this取決於show4的this指向,此處使用person1進行呼叫,所以shoe4的this指向person1
第 31 行:show4返回的是乙個箭頭函式,箭頭函式的this不會被call改變,依舊時取決於父級的show4函式的this,此處person1進行呼叫,所以依舊是指向的this
第 32 行:修改了show4函式的this指向,指向了person2,由於上面說的,此處箭頭函式的this是取決於show4的,所以箭頭函式的this也指向了person2。
var name = 'window'
function person (name)
this.show2 = () => console.log(this.name)
this.show3 = function ()
}this.show4 = function ()
}var persona = new person('persona')
var personb = new person('personb')
persona.show1() // persona
persona.show1.call(personb) // personb
persona.show2() // persona
persona.show2.call(personb) // persona
persona.show3()() // window
persona.show3().call(personb) // personb
persona.show3.call(personb)() // window
persona.show4()() // persona
persona.show4().call(personb) // persona
persona.show4.call(personb)() // personb
此題是乙個建構函式,並且示例化出兩個物件,persona 和 personb。
第 22 行:建構函式例項的物件呼叫函式,函式this指向呼叫物件,所以此處是指向了persona
第 23 行:show1函式的this被call修改,指向 personb
第 25 行:show2 為乙個箭頭函式,this指向父級作用域,此處也就是建構函式內部,取決於呼叫物件,此處是persona進行呼叫,所以this指向了persona
第 26 行:箭頭函式的this指向不會被call修改,所以依舊是指向persona
第 28 行:show3 返回乙個函式,屬於全域性呼叫,this指向全域性,等價於
let show3 = persona.show3();
show3();
第 29 行:等價於
let show3 = persona.show3();
show3.call(personb);
第 30 行:等價於
let show3 = persona.show3.call(personb);
show3();
第 32 行:show4 返回乙個箭頭函式,取決於show4的呼叫者,此處為 persona
第 33 行:箭頭函式的this不會被call修改,此處依舊取決於 show4 的呼叫者,指向 persona
第 34 行:修改 show4 的this指向,而箭頭函式的this取決於show4 所以此處this指向了 personb
以上為對js中this指向的闡述。得出結論:** === 玄學
理解js中this的指向問題
在前端的飛速發展的過程中,各種框架層出不窮,但是當大家看到這些框架的原始碼時,大家也許會發現很多框架都有this 這個問題,由此看來this的指向是多麼的重要,但是關於this問題許多人對於他的指向問題一直都是很模糊,那麼就讓我們來一起看一下this的指向到底是怎麼樣的。首先必須要說的是,this的...
徹底理解js中this的指向
首先必須要說的是,this的指向在函式定義的時候是確定不了的,只有函式執行的時候才能確定this到底指向誰,實際上this的最終指向的是那個呼叫它的物件 這句話有些問題,後面會解釋為什麼會有問題,雖然網上大部分的文章都是這樣說的,雖然在很多情況下那樣去理解不會出什麼問題,但是實際上那樣理解是不準確的...
徹底理解 JS 中 this 的指向
首先必須要說的是,this的指向在函式定義的時候是確定不了的,只有函式執行的時候才能確定this到底指向誰,實際上this的最終指向的是那個呼叫它的物件 這句話有些問題,後面會解釋為什麼會有問題,雖然網上大部分的文章都是這樣說的,雖然在很多情況下那樣去理解不會出什麼問題,但是實際上那樣理解是不準確的...