2013-10-10 54 views
0

我很困惑,在JS構造函數中,上下文有什麼問題。在ctor中我聲明瞭一個函數。在該函數的調用this被設置爲ctor的上下文之前。函數內部的值this設置爲window。我不明白爲什麼。在HTML中,ctor被稱爲'new'。新手:Javascript構造函數和範圍上下文問題

function MyCtor() { 
    var myFunc = function() { 
     debugger; // #2 
     // code for myFunc 
    } 

    debugger; // #1 
    myFunc(); 
    debugger; // #3 
} 

在調試器#1,this設爲MyCtor。在#2 thiswindow。然後在#3回到MyCtor

我確定我在這裏錯過了一些基本的東西,但我已經閱讀了很多範圍和上下文;顯然不夠。

+2

閱讀關於函數和範圍在這裏:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope – Ian

+0

...和關於[''this''關鍵字(「上下文」)在這裏] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)。它不應該被設置爲'MyCtor',除非你以奇怪的方式調用構造函數。 – Bergi

+0

@Bergi當我們用新的方式調用MyCtor時,「this」會在body內顯示什麼? –

回答

2

this對象是Javascript中令人討厭的難以理解的概念之一。這是一場相當激烈的比賽......首先,你必須明白,這將是特定於你所調用的每個函數 - 你調用myFunc的上下文不會設置它的方式。這裏是你可以做這件事:

function MyCtor() { 
    this.myFunc = function() { 
     debugger; // #2 
     // code for myFunc 
    } 

    debugger; // #1 
    this.myFunc(); 
    debugger; // #3 
} 

一般來說,只有在其中你可以依靠一個函數的this是一個特定值的幾種情況。所有這些,據我所知:

objectToBeThis.aFunction = function() { ... } // declare this function as 
// an object property at any time - 
objectToBeThis.aFunction(); 

或者不經常使用的是:

aFunction.call(objectToBeThis, extraArgument1, extraArgument2); 

當一個命名,而不是 「擁有」 功能(即var functionName = function(),或function functionName())被調用,那麼它將具有window作爲其參數this。這部分我不太確定,但我不會在這種方法中使用this

就像你的代碼一樣,還有「新的MyCtor」 - 其中創建了一個新對象來返回,並且該對象在構造方法中設置爲this

+0

這裏還是有點困惑。這是否意味着通過提升,所有'var'聲明真的屬於'窗口'?我認爲這會導致名稱衝突。如果'myFunc'在構造函數中使用'var'聲明,爲什麼不綁定到'MyCtor'? – Les

+0

在(http://stackoverflow.com/questions/8670877/this-value-in-javascript-anonymous-function)中找到附加信息 – Les

+0

屬於「窗口」的任何東西都是全局的。任何函數參數或在函數內部聲明的變量都是該函數可以訪問的局部變量,以及在該函數內部聲明的任何函數(閉包)。'var's並不真正「屬於」任何對象,因此,您不使用它們的點語法。這也意味着你不能在它聲明的函數之外訪問'var'。這絕對是令人困惑的。 – Katana314