2016-11-08 39 views
1

我試過了閉包並發現了意外的行爲。有人可以解釋爲什麼這個代碼以這種方式工作嗎?javascript - 在外部函數中定義的訪問屬性

function foo() { 
    this.a='hello'; 
    return { 
     aaa:function() { 
     return a; // this suprises me, how can be here accessed 'a' ? 
     } 
    } 
} 

o=foo(); 
alert(o.aaa()); // prints 'hello' ! , I expected undefined 

我不明白,爲什麼我總是用var that=this句話,如果有可能從內部功能直接訪問功能特性。

的jsfiddle https://jsfiddle.net/5co6f707/

+0

'this'並不總是指向同一個對象。這取決於函數如何被調用。寫'var that = this'是捕獲'this'引用的原始對象的一種方式,以防對象引用稍後改變。 –

+0

'this'關鍵字與閉包無關嗎?如果你已經使用了'var a',它就可以工作。 – Bergi

回答

-1

當執行該代碼:

o=foo(); 

foo在全局上下文中執行,因此該行:

this.a='hello'; 

增加a屬性全局對象 - window

當你打電話給你aaa功能是這樣的:

o.aaa() 

變量a所以它的擡頭上了作用域鏈和它在窗口發現未在函數中定義:

function() { 
    return a; // found on window.a 
} 

window.a返回。

+0

傢伙,我不明白爲什麼這會一再downvoted?你能至少指定一個理由嗎? –

5

它顯示'hello'因爲你在嚴格模式下是沒有,所以this是全球window對象,而不是不確定的,和a成爲當值賦給this.a一個全局變量。由於a是一個全局變量,因此無處不在。您可以在腳本的最後加上alert(a);,它也會顯示'hello'https://jsfiddle.net/5co6f707/1/

它不應該工作(並且不在嚴格模式下)並且不應該使用它。如果您打算使用foo作爲構造函數,那麼在調用它時應該使用new關鍵字(這會破壞您的代碼,但以一種好的方式)。

+0

是的,我在node.js中太長了,所以我忘記了窗口對象現象。 – user2106769

相關問題