Javascript对象中的函数范围与代码顺序
考虑以下HTML:Javascript对象中的函数范围与代码顺序,javascript,function,object,scope,javascript-engine,Javascript,Function,Object,Scope,Javascript Engine,考虑以下HTML: <p>Click me</p> 当我将click handler赋值包装到函数中时,它会执行以下操作: (function(){ var self = this; $("p").each(function(){ $(this).click(self.myFunction); }); self.myFunction = function(){ alert("myFunction"); } })();
<p>Click me</p>
当我将click handler赋值包装到函数中时,它会执行以下操作:
(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"); }
})();
$("p").click(myFunction);
function myFunction(){ alert("myFunction"); }
问题:为什么$(这个)。单击(self.myFunction)
可以工作,但是$(这个)。单击(function(){self.myFunction();})
可以吗
编辑:以下代码不起作用:
(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"); }
})();
$("p").click(myFunction);
function myFunction(){ alert("myFunction"); }
这不也应该失败吗
另外,我通过移动函数的位置使我的对象工作,而无需包装函数:
(function(){
var self = this;
self.myFunction = function(){ alert("myFunction"); }
$("p").each(function(){
$(this).click(self.myFunction);
});
})();
我想问题与解析器有关。我想您已经解决了问题。在附加处理程序时,
self.myFunction
没有定义,因此甚至没有附加处理程序
但是当您像function(){self.myFunction();}
那样包装调用时,则在调用处理程序时调用self.myFunction
,而不是在附加处理程序时调用。在本例中:
(function(){
var self = this;
$("p").each(function(){
$(this).click(self.myFunction);
});
self.myFunction = function(){ alert("myFunction"); }
})();?
立即对引用进行评估,由于尚未在self
中放置任何内容,因此引用失败
在这里:
在实际发生单击时对引用进行求值,这在self.myfunction被分配给之后很长一段时间
事实上,这不是一个问题,而是一个有意的设计特征
在本例中:
$("p").click(myFunction);
function myFunction(){ alert("myFunction"); }
函数名被提升到作用域的顶部。因为这个函数定义没有动态性(意味着它没有被动态地分配给对象),所以它在整个范围内,从上到下都是可用的
函数填补了JavaScript中的许多空白
它们充当lambda、模块、方法、函数,可能还有更多我现在想不起来的功能。很好的解释,明天我将投票支持,因为我已经用完了当天的所有投票:)这是理解这类事情的额外资源,(作者:John Resig!):感谢您的解释。在设计对象时,我需要记住这一点。您需要理解javascript代码解析和求值顺序。看这个:@slebetman+1为你回答另一个问题。谢谢