2013-02-11 396 views
0

我不明白一兩件事:爲什麼實例變量未定義?

var comein = document.getElementById("comein"); 

var enter = new Expand({ elem : comein }); 

function Expand (options) { 
    this._elem = options.elem; 
    console.log(this._elem); // i have a div element  
} 

Expand.prototype = {   
    check : function() { 

     var comInClassName = this._elem.className; // i have an error: this._elem is undefined 

     if (comInClassName == "open"){ 
      this.close(); 
     } 
     if (comInClassName == "close"){ 
      this.open(); 
     } 
    } 
} 
log_in.addEventListener("click", enter.check, false); 

爲什麼我有原型法一個錯誤,如果在展開我有一個正常的元素?謝謝

+3

到底是如何,你* *調用的 「檢查」 功能? – Pointy 2013-02-11 16:30:40

+0

log_in.addEventListener(「click」,enter.check,false); – 2013-02-11 16:36:34

回答

6

這完全取決於你如何致電check。如果你這樣稱呼它:

enter.check(); 

....然後調用內,this將參照enter對象,它將有一個_elem財產。如果,另一方面,你將它設置成這樣調用:

enter._elem.addEventListener('click', enter.check, false); 

...然後內調用(事件發生時),thisenter,而是this._elem,所以它沒有_elem屬性。

發生這種情況是因爲在JavaScript中(現在),函數調用中的this完全由調用函數的方式定義,而不是定義函數的位置。如果你把它作爲從檢索對象的函數引用表達式的組成部分:

enter.check(); 

...然後this是指你從函數引用的對象。但是,如果您分開撥打電話,與上面的addEventListener呼叫一樣,則不會。

如果你在啓用ECMAScript5環境(或者,如果你有象樣的ES5墊片),您可以修復使用Function#bind

enter._elem.addEventListener('click', enter.check.bind(enter), false); 

bind返回,當調用的函數,將轉向並使用給定的this值(在我們的例子中爲enter)調用基礎函數。

探索更多(在我的博客):

+0

是的,你說得對,如果我打電話enter.check() - 沒有問題,但是我怎麼能爲這個檢查添加Event Listener? – 2013-02-11 16:38:36

+0

@ user1506183:就像您輸入該評論時一樣,我添加了一個關於'Function#bind'的註釋。鏈接的文章也會詳細介紹如何處理這個問題。 – 2013-02-11 16:39:10

+0

太神奇了,謝謝) – 2013-02-11 16:41:32