2012-09-07 46 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被称为时处理程序被调用,而不是当它被连接。