jQuery和函数范围

时间:2010-04-29 00:29:39

标签: jquery

这是:

    ($.fn.myFunc = function() {
       var Dennis = function() { /*code */ }
       $('#Element').click(Dennis);
    })();

相当于:

    ($.fn.myFunc = function() {
       $('#Element').click(function() { /*code */ });
    })();

如果没有,有人可以解释一下这些差异,并建议更好的方法,包括性能,功能重用和阅读清晰度。

谢谢!

4 个答案:

答案 0 :(得分:8)

唯一的区别是前者提供了对函数的引用。

因此,您可以这样做:

($.fn.myFunc = function() {
   var Dennis = function() { /*code */ }
   $('#Element').click(Dennis);

   Dennis();
})();

后者无法做到这一点。

这可能很有用。例如,我可能希望单击操作页面的一部分,但我也想在页面加载时执行此操作。我可以这样做:

$(function(){ 

    var manipulateSomething = function() {
        // do stuff
    };

    // do it on click
    $("#Element").click(manipulateSomething);

    // and do it right now (document.ready)
    manipulateSomething();

});

(旁白:除非您希望$("#Element").click();上的所有点击处理程序都能触发,否则您不会致电#Element来完成此任务。)

答案 1 :(得分:0)

它是一样的。我通常选择第二个,即匿名函数路径。

如第一个示例所示,将函数命名为内联的唯一原因是,如果您需要再次使用它,可能在函数的后期,或者您想要非常清楚函数是什么。但即使在这种情况下,如果Dennis函数要接受参数,那么仍然需要在调用中使用新的函数作用域来传递这些参数。

匿名函数闭包是更强大的模式。

答案 2 :(得分:0)

第二个看起来更漂亮:) 但它是一样的

答案 3 :(得分:0)

是的,匿名函数更清晰,但没有添加多余的命名函数,这些函数会立即被调用。

如果你真的想在那里写一个名字,你can。通常只会将名称放在那里以使它们递归。