簡單談?wù)刯avascript中this的隱式綁定
我們先來看一個例子
function foo() { console.log( this.a ); } var obj = { a: 2, foo: foo }; obj.foo(); // 2
this指向了obj,因?yàn)閒oo執(zhí)行時的call-site(可以理解為調(diào)用時所在作用域)在obj上面。注意是運(yùn)行的時候,和在哪里聲明的沒有關(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`
理解之后再回頭看開頭的例子,是不是感覺清晰了很多。其實(shí)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,但實(shí)際上相當(dāng)于是直接對foo引用而已,所以會默認(rèn)綁定到全局。
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種方法與比較
- 詳細(xì)講解JavaScript中的this綁定
- JavaScript中this的四個綁定規(guī)則總結(jié)
- js綁定事件this指向發(fā)生改變的問題解決方法
- JavaScript call apply使用 JavaScript對象的方法綁定到DOM事件后this指向問題
- Javascript中的this綁定介紹
- javascript下動態(tài)this與動態(tài)綁定實(shí)例代碼
- JavaScript this綁定過程深入詳解
相關(guān)文章
JavaScript 創(chuàng)建運(yùn)動框架的實(shí)現(xiàn)代碼
本篇文章是對,在JavaScript中創(chuàng)建運(yùn)動框架的實(shí)現(xiàn)方法進(jìn)行了介紹。需要的朋友參考下2013-05-05javascript開發(fā)技術(shù)大全 第2章 開始JAVAScript之旅
1st JavaScript Editor ,除了有著色處,還有html標(biāo)簽、屬性、javascript事件、函數(shù),另外還可調(diào)用外部編輯來編輯網(wǎng)頁,也可將常用瀏覽器內(nèi)置在窗口中。2011-07-07Javascript技術(shù)棧中的四種依賴注入小結(jié)
本文總結(jié)了Javascript中常見的依賴注入方式,并以inversify.js為例,介紹了方言社區(qū)對于Javascript中DI框架的嘗試和初步成果2016-02-02