Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript对象中的函数范围与代码顺序_Javascript_Function_Object_Scope_Javascript Engine - Fatal编程技术网

Javascript对象中的函数范围与代码顺序

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"); } })();​

考虑以下HTML:

<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为你回答另一个问题。谢谢