JavaScript IIFE

时间:2014-02-14 14:07:58

标签: javascript scope iife

我会承认,当涉及到JavaScript时,我已经非常环保了,每次我认为我得到一些奇怪的曲线球时,我都没有帮助。

我有一个像这样的js文件:

(function (myiife, $) {

    var myArrayOfThings = [];    

    myiife.myFunction = function (id) {
        var cachedThing = myiife.getFromArray(id);
        if (cachedThing === null) {
            // get from server
        } else {
            // do something with cached item
        }
    };

    myiife.getFromArray = function (idToFind) {
        for (var i = 0, len = myArrayOfThings; i < len; i++) {
            if (myArrayOfThings[i].Id=== idToFind) {
                return myArrayOfThings[i]; // Return as soon as the object is found
            }
        }
        return null;
    };

}(window.myiife= window.myiife|| {}, jQuery));

让我感到困惑的是期望能够打电话的正确方法。我想我真的不明白事情的范围而且我很难说实话。

如果我想从页面调用myFunction,它是否应该看起来像这样?

onclick="myiife.myFunction(1)"

我已经阅读了有关范围的内容,但我显然仍然缺少一些非常基本的内容。

从我看过的例子中我看不到其他似乎必须在函数名前加上iife名称才能从页面执行的事情。

任何好的推荐阅读也会受到赞赏。

1 个答案:

答案 0 :(得分:1)

Javascript中的全局范围(至少在浏览器中)为window。您所做的就是将myiife附加到窗口,myiffe有一个名为myFunction的函数。因此,如果您想从全局范围(即window)调用它,那么当然,您需要指定myiffe.myFunction()

你可能已经看到其他人做的事情是这样的:

var myFunction = (function() {
    var counter = 0;
    return function() {
        counter++;
        console.log(counter);
    };
})()

他们有一个IIFE返回的东西(在这种情况下是一个函数,在许多其他情况下,人们会返回一个对象)。在这种情况下,由于myFunction是一个全局变量,因此只能使用myFunction()调用它。他们与IIFE取得的成果基本上是将counter变量设为私有。只有IIFE内部的东西才能访问它。

当然,如果你没有在IIFE中定义myFunction,那么它只是全局范围内的一个函数,可以直接从全局范围调用。

 function myFunction() {
     // do something
 }

 myFunction();

但是关于在事件处理程序中使用它的问题 - 更好的做法是首先不在HTML中内联您的事件处理程序,而是将其绑定在代码中。这为您提供了更大的灵活性,更清晰的分离和更易于维护的代码。