2015-06-04 50 views
2

在JavaScript中使用私有方法時,遇到了有線問題。裏面的私有方法「這個」引用了返回的句柄窗口對象,而不是功能,其中它包含英寸私有方法中的「this」的上下文

這裏的代碼,我指的是

function MyComponent(elem) { 
    alert(this.constructor.name) //returns reference to MyComponent 
    function privateMethod() { 
    alert(this.constructor.name) 
    //returning Window Object, instead of privateMethod function reference 
    } 
    privateMethod() 
} 

new MyComponent(document.createElement('span')) 

我設法解決的bug通過引入MyComponent函數中的「self」引用。

function MyComponent(elem) { 
    var self = this; 
    alert(this.constructor.name) //returns reference to MyComponent 
    function privateMethod() { 
    alert(self.constructor.name) 
    //after passing the "self" reference its working 
    } 
    privateMethod() 
} 

new MyComponent(document.createElement('span')) 

但是還有一件事讓我感到困惑,那就是私有方法中的「this」引用是如何返回Window對象的句柄的。

+0

您可以查看「this」:http://alistapart.com/article/getoutbindingsituations –

回答

1

this參考實際上依賴於函數調用的類型。 你已經使用函數形式簡單的調用調用privateMethod()privateMethod()將涉及全球object.Instead因此this如果你曾使用過構造形式調用privateMethod()(即new privateMethod()this將參照它被包含在函數。

結帳在MDN

所以

01簡單的通話話題
function MyComponent(elem) { 
    alert(this.constructor.name) //returns reference to MyComponent 
     function privateMethod() { 
     alert(this.constructor.name) //returns privateMethod function reference 
    } 
new privateMethod() 
} 

new MyComponent(document.createElement('span')) 
0

在這種情況下,你應該通過this到您呼叫的功能,如privateMethod.call(this);

function MyComponent(elem) { 
 
    alert(this.constructor.name) //returns reference to MyComponent 
 
    function privateMethod() { 
 
    alert(this.constructor.name) 
 
    //returning Window Object, instead of privateMethod function reference 
 
    } 
 
    privateMethod.call(this); 
 
} 
 

 
new MyComponent(document.createElement('span'))