簡單談?wù)刯avascript中this的隱式綁定
我們先來看一個例子
function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo
};
obj.foo(); // 2
this指向了obj,因為foo執(zhí)行時的call-site(可以理解為調(diào)用時所在作用域)在obj上面。注意是運行的時候,和在哪里聲明的沒有關(guān)系。
call-site and call-stack
call-site姑且理解為調(diào)用域,call-stack為調(diào)用棧。如下代碼可以輔助我們理解
function baz() {
// call-stack is: `baz`
// so, our call-site is in the global scope
console.log( "baz" );
bar(); // <-- call-site for `bar`
}
在baz()中調(diào)用bar(),所以bar的調(diào)用域是baz,此時bar的調(diào)用棧只有baz;而baz本身暴露在全局作用域中,所以它的調(diào)用域則也在全局作用域中。
function bar() {
// call-stack is: `baz` -> `bar`
// so, our call-site is in `baz`
console.log( "bar" );
foo(); // <-- call-site for `foo`
}
function foo() {
// call-stack is: `baz` -> `bar` -> `foo`
// so, our call-site is in `bar`
console.log( "foo" );
}
baz(); // <-- call-site for `baz`
理解之后再回頭看開頭的例子,是不是感覺清晰了很多。其實this只是指向了它的call-site
還有如下玩法:
function foo() {
console.log( this.a );
}
var obj2 = {
a: 42,
foo: foo
};
var obj1 = {
a: 2,
obj2: obj2
};
obj1.obj2.foo(); // 42
Implicitly Lost(隱式丟失)
function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo
};
var bar = obj.foo; // function reference/alias!
var a = "oops, global"; // `a` also property on global object
bar(); // "oops, global"
雖然bar引用了obj上的foo,但實際上相當于是直接對foo引用而已,所以會默認綁定到全局。
function foo() {
console.log( this.a );
}
function doFoo(fn) {
// `fn` is just another reference to `foo`
fn(); // <-- call-site!
}
var obj = {
a: 2,
foo: foo
};
var a = "oops, global"; // `a` also property on global object
doFoo( obj.foo ); // "oops, global"
- JavaScript調(diào)用模式與this關(guān)鍵字綁定的關(guān)系
- JavaScript函數(shù)中的this四種綁定形式
- Javascript中this綁定的3種方法與比較
- 詳細講解JavaScript中的this綁定
- JavaScript中this的四個綁定規(guī)則總結(jié)
- js綁定事件this指向發(fā)生改變的問題解決方法
- JavaScript call apply使用 JavaScript對象的方法綁定到DOM事件后this指向問題
- Javascript中的this綁定介紹
- javascript下動態(tài)this與動態(tài)綁定實例代碼
- JavaScript this綁定過程深入詳解
相關(guān)文章
Ajax解決跨域之設(shè)置CORS響應(yīng)頭實現(xiàn)跨域案例詳解
這篇文章主要介紹了Ajax解決跨域之設(shè)置CORS響應(yīng)頭實現(xiàn)跨域案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
設(shè)計模式中的組合模式在JavaScript程序構(gòu)建中的使用
組合模式一般是將一系列類似的小對象組合成大的對象,由這個大對象提供接口來對里面的小對象進行操作,下買呢我們來詳細看一下設(shè)計模式中的組合模式在JavaScript程序構(gòu)建中的使用2016-05-05
總結(jié)JavaScript在IE9之前版本中內(nèi)存泄露問題
本篇文章給大家總結(jié)了JavaScript在IE9之前版本中內(nèi)存泄露問題,對此有興趣的朋友可以學習下。2018-04-04

