繁体   English   中英

以下JS语法有什么区别?

[英]What is the difference in the following JS syntax?

以下是两种定义BW.Timer的方法。 有人能告诉我有什么区别吗? 我不确定第一个是否有效,但如果它有效,那么使用myfunc=(function(){}())语法会有什么不同?

BW.Timer = (function () {
    return {
        Add: function (o) {
            alert(o);
        },
        Remove: function (o) {
            alert(o);
        }
    };
} ());

和...

BW.Timer = function () {
    return {
        Add: function (o) {
            alert(o);
        },
        Remove: function (o) {
            alert(o);
        }
    };
};

第一个是立即调用函数的返回值。 第二个是功能。 它基本上归结为它们之间的区别:

var f = (function() { return 0; })();

var f = function() { return 0; };

由于第一个函数是立即调用的,因此将0的值赋给变量f 第一个f不是函数。 但是,我们必须调用第二个f才能获得值:

f(); // 0

因此,在您的示例中,第一个BW.Timer是对象文本本身,第二个是返回对象文字的函数。 您必须调用该函数才能访问该对象:

BW.Timer().Add(x);

为什么要先使用呢?

您可能会问自己为什么会使用类似a = (function() { return {}; })()而不是a = {}的语法,但这是有充分理由的。 与常规函数不同,IIFE(Immeditately-Invoked Function Expression)允许模拟静态变量(通过单个实例维护其值的变量)。 例如:

var module = (function() {
    var x = 0;

    return {   get: function()  { return x },
               set: function(n) { x = n }
    };

})();

以上是模块模式的教科书示例。 由于函数是立即调用的,因此变量x被实例化,返回值(对象)被赋予module 除了使用为我们提供的getset方法之外,我们无法访问x 因此, x是静态的,这意味着每次使用module时都不会覆盖其变量。

module.set(5);

module.get(); // 5

另一方面,让我们看一个将module声明为函数的示例:

// assume module was made as a function

module().set(5);

module().get(); // 0

当我们调用module() ,每次都会覆盖x变量。 所以我们每次调用module时都会有效地使用modulex不同实例。

差异相当大。

在第一种情况下, BW.Timer在第一次遇到时执行,这是分配给BW.Timer的静态版本。 在那种情况下,可以使用BW.Timer.Add(1) 每次调用BW.Timer都是同一个对象。

在第二种情况下, BW.Timer在第一次遇到时不会执行,而是一个函数引用,必须调用BW.Timer() 对于要使用的Add ,必须是BW.Timer().Add(1) 此外,您可以发出var timer = new BM.Timer(); BW.Timer()每个实例在这里都是唯一的。

在第一个示例中, BW.Timer引用自执行函数返回的对象,而在第二个示例中,它引用一个函数对象,换句话说,它是一个可以执行的函数BW.Timer()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM