(function(){ ... })();
我已经查看了this帖子,并对此有所了解。但是,更多的疑问,主要是如何使用它。
因为它的行为类似于静态块(自调用!),它可以用于初始化(就像一些假设常量)?
但是没有getter
可用于从中获取任何内容并在其他地方使用它!
上面的解决方案是在该函数中有return
吗?所以我可以获取它返回的任何内容并使用它。
(function(window, undefined){})(this);
以上代码的解释是在引用的post的第二个答案中,我无法理解,如果有人能解释得更多(或者对我来说更简单),那就太棒了
var myElement=document.getElemetById("myElementId");
(function(myElement){
/**'this' here is 'myelement'???**/
};
})(this);
答案 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);
参数这个将是调用者 - 通常是窗口,但可能是任何对象。 如果您将此作为参数传递,则可通过第一个参数(案例中的窗口)访问它。
希望解释清楚。