javascript – 以下JS语法有什么区别?

前端之家收集整理的这篇文章主要介绍了javascript – 以下JS语法有什么区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以下是两种定义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 }
    };

})();

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

module.set(5);

module.get(); // 5

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

// assume module was made as a function

module().set(5);

module().get(); // 0

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

猜你在找的JavaScript相关文章