var str="hello"; var obj={ str:"world", fun:function(){ alert(str); } } obj.fun(); //结果是hello
為什麼結果是hello,而不是world
闭关修行中......
雷雷
因為你obj物件中寫著的 str:"world",表示的是obj.str=“world”。這是一個屬性,不是一個變數。而你最後執行的obj.fun()裡面彈出的是str變量,並不是屬性(當然這也是全域window的屬性)。這麼說你懂了嗎。如果你alert this.str 或obj.str都能拿到"world"。
變數 str 其實是 window 的屬性,和 obj 物件的 str 屬性是沒有關係的。這不涉及作用域鏈問題,你理解的情況應該是下面這種:
var str="hello"; function change(){ str="world"; alert(str) } change();
這個例子中,函數change 中先對全域變數str 重新賦值,要執行alert(str) 時,就在自身的作用域鏈起點也就是自己的變數物件中尋找str 這個變量,發現沒有就接著往上第一級尋找,找到了str 變量,不過這時str 已經被重新賦值為world ,所以會彈出world。
var str="hello"; var obj={ str:"world", fun:function(str){ console.log(window.str,this.str,str); } } obj.fun('!') //hello world !
懂木有了?
雷雷
雷雷
因為你obj物件中寫著的 str:"world",表示的是obj.str=“world”。這是一個屬性,不是一個變數。而你最後執行的obj.fun()裡面彈出的是str變量,並不是屬性(當然這也是全域window的屬性)。這麼說你懂了嗎。如果你alert this.str 或obj.str都能拿到"world"。
變數 str 其實是 window 的屬性,和 obj 物件的 str 屬性是沒有關係的。這不涉及作用域鏈問題,你理解的情況應該是下面這種:
這個例子中,函數change 中先對全域變數str 重新賦值,要執行alert(str) 時,就在自身的作用域鏈起點也就是自己的變數物件中尋找str 這個變量,發現沒有就接著往上第一級尋找,找到了str 變量,不過這時str 已經被重新賦值為world ,所以會彈出world。
懂木有了?