自调用匿名函数表达式

时间:2013-08-13 08:12:11

标签: javascript

(function(){ ... })();

我已经查看了this帖子,并对此有所了解。但是,更多的疑问,主要是如何使用它。


像静态块一样!

因为它的行为类似于静态块自调用!),它可以用于初始化(就像一些假设常量)?

但是没有getter可用于从中获取任何内容并在其他地方使用它!


返回,必须?

上面的解决方案是在该函数中有return吗?所以我可以获取它返回的任何内容并使用它。


对全局对象的引用?!

(function(window, undefined){})(this);

以上代码的解释是在引用的post的第二个答案中,我无法理解,如果有人能解释得更多(或者对我来说更简单),那就太棒了


更新:看一下这段代码↓

var myElement=document.getElemetById("myElementId");
 (function(myElement){
      /**'this' here is 'myelement'???**/
 }; 
})(this);

3 个答案:

答案 0 :(得分:15)

一个常见的metod如下(称为命名空间) - 它通过立即执行你的函数并将你需要的基本部分返回到变量中来创建一个封装的范围:

var yourNamespace = (function(window, undefined){ 
                    /* private code:*/
                    var privateVar = "foobar",
                        count = 0;
                    /* the stuff you want to use outside: */
                    return{
                       val: 5,
                       publicVar:privateVar,
                       func:function(){return ++count}
                    }
             })(this);// `this` is a reference to `window` here

通过这种方式,您可以通过yourNamespace变量访问所需的所有内容,同时仍保持隐私并且不会污染全局对象。它被称为命名空间并使用闭包范例。您还可以将函数移交给私有(对于封闭范围不可见)变量。

移交未定义的一个原因是,在ES3中未定义是可写的,在ES5中不再是这种情况。移交this作为参数会通过创建对作用域中全局window对象的直接引用来缩短查找。但是,要非常谨慎 - 在ES5严格模式下this不再是窗口了,而是解析为undefined !!所以不推荐这个了!

移交窗口和未定义的另一个原因是,现在这些是变量名称,缩小器可以将它们压缩为单个字母。

if(myVar == undefined)
// could be compressed to:
if(a==x)

编辑您的问题:

this在您的示例中不会更改,您需要以下解决方案之一:

(function(myElement){/*your code*/})( document.getElemetById("myElementId") );
// or:
(function(){
    var myElement = document.getElemetById("myElementId");
    /* your code */ 
})();

答案 1 :(得分:2)

iife的要点是创建一个封装的范围。否则,您声明的所有变量将最终出现在全局范围内 如果您需要在该范围内访问某些内容,您可以显式创建一个全局命名空间变量,即window.myApp = {}并将其附加到那里,即window.myApp.myMethod = function(){...}
window传递给iife的原因是它在范围内创建了一个本地引用。这将缩短查找链以获得更好的性能,变量也将是可缩小的。


回答您的最新问题:

要使用此模式为元素创建本地引用,您可以将其作为参数提供给iife:

(function(element){

    element.style.top = "100px";

})(document.getElementById("myId"));

...但我不确定以这种方式使用模式有多大价值? 根据我的评论,this关键字不受影响,在此示例中仍会指向window

我认为this关键字让您感到困惑 - 它与iife模式无关。 以下是对其价值如何确定的一个很好的解释: http://net.tutsplus.com/tutorials/javascript-ajax/fully-understanding-the-this-keyword/

答案 2 :(得分:2)

>它可以用于初始化? ...没有getter可以从中获取任何内容!

是的,它经常用于初始化,虽然它可能不需要获取任何东西。

>上面的解决方案是返回?

不,它不会有回报,但它可能会。如果有回报,它将会过去......即

var a = (function(){})();

a将返回或未定义任何内容。

  

(function(window, undefined){})(this);

参数这个将是调用者 - 通常是窗口,但可能是任何对象。 如果您将此作为参数传递,则可通过第一个参数(案例中的窗口)访问它。

希望解释清楚。