代码之家  ›  专栏  ›  技术社区  ›  Alexey Romanov

javascript中的函数值

  •  8
  • Alexey Romanov  · 技术社区  · 16 年前

    nextplease.init = function() {...} 是一个没有参数的函数。我期待 nextplease.init function() {nextplease.init();} 行为相同。它们之间有什么可能的区别吗(很明显,你可以给 下面是 ,但我们不包括这一点吗? 尤其是,在行为上 window.addEventListener("load", nextplease.init, false); window.addEventListener("load", function() {nextplease.init();}, false); ?

    我试图找到的bug在 Objects in JavaScript defined and undefined at the same time (in a FireFox extension) 有人建议使用第一种形式而不是第二种形式可能会有所不同。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Jeff Meatball Yang    16 年前

    一个重要的区别是nextplease.init引用的函数体中“this”关键字的值。

    假设NextPlease定义如下:

    nextplease = {};
    nextplease.someCustomProperty = "hello";
    nextplease.init = function () { alert(this.someCustomProperty); }
    

    在第一个示例中,“this”的值是dom对象,警报将失败:

    window.addEventListener("load", nextplease.init, false);     
    

    在第二种形式中,“this”的值将是NextPlease对象,警报将说“hello”:

    window.addEventListener("load", function() {nextplease.init();}, false);
    

    参考MDC文档:

    https://developer.mozilla.org/en/DOM/element.addEventListener

        2
  •  0
  •   Gabriel McAdams    16 年前

    有两种可能的差异

    window.addEventListener("load", nextplease.init, false);
    

    这将调用函数,仅此而已。如果您想添加参数,那么就无法设置它们。

    window.addEventListener("load", function() {nextplease.init();}, false);
    

    另一方面,这允许您调用多个函数,并允许您设置参数。它还增加了调用函数和在内存中存储函数的额外开销。

        3
  •  0
  •   friedo    16 年前

    这两个:

    window.addEventListener("load", nextplease.init, false); 
    window.addEventListener("load", function() {nextplease.init();}, false);?
    

    几乎 完全一样,假设 nextplease.init 是函数对象。

    一个区别是,在第二种情况下,传递给外部函数的任何参数(即使其签名没有定义任何参数,但它们仍然可以传递)都不会传递给 nextplease.init() . 但因为这只是 addEventListener API,你知道什么会提前传递。