昨天做了百度的前端筆試題,其中有一個問輸出結果的題,感覺有點懵,平時js是用到哪看到哪,沒有研究這么深入。現在整理一下。
題目:
var myObject={
foo : "", func : function(){ var self = this; console.log("outer func : this.foo = " + this.foo ); console.log("outer func : self.foo = " + self.foo ); (function(){ console.log("inner func : this.foo = " + this.foo ); console.log("inner func : self.foo = " + self.foo ); }()); }
之前理解有點偏差,記得函數function也是對象,{}也是對象,所以一開始認定func這個成員方法中的this應該指的是這個函數自身,而這個函數中沒有foo,所以應該是undefined。
后來感覺不對,如果這么搞,這個題輸出就全部是undefined,就沒意義了。
后來改為認定成員方法中this訪問的是包含它的對象。而這個對象中沒有foo,就根據作用於鏈向上找,就能找到外面定義的foo,值為bar。那么結果就是bar,bar,bar,undefined
回來一查,又錯了!
寫了段代碼驗證一下
var a = "1"; var tObj = { a : "2", tFunc : function (){ var a = "3"; alert(this.a) } } tObj.tFunc();
彈出2,說明成員方法中的this指向的是包含它的對象!
注釋掉一行代碼:
var a = "1"; var tObj = { //a : "2", tFunc : function (){ var a = "3"; alert(this.a) } } tObj.tFunc();
彈出undefined,說明this對象引用的成員變量僅限於自身定義的變量,不會根據作用域鏈向上調用!(形成作用域鏈的是直接引用,而非通過this!)
javascript中的this問題,可參考這篇文章,寫的不錯。
http://blog.csdn.net/lixam/article/details/12493245
另外還有個經典的問題:
http://www.zhihu.com/question/21172721/answer/17413362