2012-09-07 42 views
3

考慮這個HTML:範圍的功能與JavaScript代碼順序對象

<p>Click me</p> 

我還想寫爲每個p click處理的對象,而是碰上的問題,我的點擊事件處理函數可以不被發現。

此代碼工作:

(function(){ 
    var self = this; 

    $("p").each(function(){ 
     $(this).click(self.myFunction); 
    }); 

    self.myFunction = function(){ alert("myFunction"); } 
})();​ 

當我包裝在一個函數單擊處理程序分配它確實工作:

(function(){ 
    var self = this; 

    $("p").each(function(){ 
     $(this).click(function(){ self.myFunction(); }); 
    }); 

    self.myFunction = function(){ alert("myFunction"); } 
})(); 

問題:爲什麼不$(this).click(self.myFunction)工作,但$(this).click(function(){ self.myFunction(); })呢?


編輯:下面的代碼工作:

$("p").click(myFunction); 
function myFunction(){ alert("myFunction"); } 

不應該這個失敗呢?


P.S.我有我的目標,而不需要工作通過移動功能的位置來包裝功能:

(function(){ 
    var self = this; 

    self.myFunction = function(){ alert("myFunction"); } 

    $("p").each(function(){ 
     $(this).click(self.myFunction); 
    }); 
})(); 

我想這個問題是解析器相關。

+1

您需要了解JavaScript代碼解析和評估順序。看到這個:http://stackoverflow.com/questions/3887408/javascript-function-declaration-and-evaluation-order/3887590#3887590 – slebetman

+0

@slebetman +1爲你回答另一個問題。謝謝。 –

回答

3

在此:

(function(){ 
    var self = this; 

    $("p").each(function(){ 
     $(this).click(self.myFunction); 
    }); 

    self.myFunction = function(){ alert("myFunction"); } 
})();? 

參考立即評估,因爲沒有被放置在self然而,它失敗。

這裏:

(function(){ 
    var self = this; 

    $("p").each(function(){ 
     $(this).click(function(){ self.myFunction(); }); 
    }); 

    self.myFunction = function(){ alert("myFunction"); } 
})(); 

當點擊實際發生的基準評估,self.myfunction被分配到後多。

這實際上不是一個問題,而是一個有意的設計特徵。

在這個例子中:

$("p").click(myFunction); 
function myFunction(){ alert("myFunction"); } 

函數名稱被提升到的範圍的頂部。由於這個函數定義沒有什麼動態的(意味着它沒有被動態地分配給一個對象),它在整個範圍內都是可用的,從上到下。

函數填補了JavaScript中的許多空白。

它們充當lambda表達式,模塊,方法,函數,可能更多,我現在無法想象。

+1

好的解釋,明天就會投票,因爲我已經用完了我所有的投票日。:)這是瞭解這些事情的額外資源,(通過John Resig!):http://ejohn.org/apps/學習 – Asciiom

+0

感謝您的解釋。設計對象時,我需要牢記這一點。 –

0

我想你已經想通了你的問題。目前你附加處理程序,self.myFunction沒有定義,所以沒有連接處理程序。

但是,當您打包電話像function(){ self.myFunction(); }那麼self.myFunction被稱爲時處理程序被調用,而不是當它被連接。