可能重复:
javascript function vs. ( function() { … } ());
如果这是太基本的话,很抱歉,但是这个构造是做什么的?
(function MyFunction() {
/* Some codes ... */
})();也许有一个特殊的术语吗?这对于谷歌搜索是有用的,而不仅仅是把这个片段放在搜索字段中。
发布于 2011-12-28 13:49:14
它被称为直接调用模式。它定义了一个匿名函数,然后立即执行它。这对于“私有”变量和诸如此类的变量非常有用。如果你通常这样做的话:
// global namespace
var data = 'lol';
function getData() {
return data;
}全局命名空间中会有一个变量数据,如果有人在web控制台中输入data = 123,它可能会破坏您的脚本。使用直接调用模式,您可以这样做:
// global namespace
/*lotsofcodehere*/
(function MyFunction() {
// closure namespace
var data = 'lol';
this.getData = function getData() {
return data;
}
})();
// global again在这种情况下,函数getData仍然存在于全局命名空间中,但是数据将无法从闭包命名空间外部访问。
在使用此模式时,您还会注意到全局命名空间中不存在MyFunction。这是因为有许多小的语言规则之一,但基本上,函数的名称在函数中总是可用的。如果你有这样的东西:
// returns the amount of from--s needed to get to 0 :D
// (yes, it returns it's input number :D)
(function() {
var i = 0, keep = false;
this.countToZero = function(from) {
if(from === 0) {
keep = false; // don't keep i's contents on next invocation
return i;
}
if(!keep) i = 0; // reset i on first invocation
i++;
keep = true;
return countToZero(from - 1);
}
})();它完美地工作,countToZero( 5 )将很好地返回5。但是,如果您在非全局命名空间中使用它,如果在函数中使用它,它将countToZero定义为该函数的成员属性,这将破坏我们的返回(因为countToZero不再可以通过全局命名空间访问)。
这可能不是一个现实的场景,但它适用于这个示例。我们将使用以下代码来代替上面的代码:
/*code*/
this.countToZero = function countToZero(from) {
// countToZero will *always* exist here as a reference to this function!
/*code*/
return countToZero(from);
};这段代码很难破译,当然,如果您将Infinity作为第一个param传递,即使您以完全荒谬的方式使用它也是如此。
..。
我是说我要给出清晰的解释还是很好的真实的例子?我希望我没有
发布于 2011-12-28 13:44:29
它创建并执行函数MyFunction,而不将其放置在全局命名空间中。这是避免名称空间污染的一个好方法。一旦执行,就不能再执行了,因为它实际上并没有被保存到任何地方。
发布于 2011-12-28 13:46:06
这基本上会调用MyFunction()中的代码,而不会将其添加到全局命名空间中,不用说,在MyFunction中定义的变量也不会在全局名称空间中可用。
我在大多数情况下都看到了这种构造,同时需要执行一段具有需要隐藏的递归逻辑的代码,例如遍历某些子文档到页面。
https://stackoverflow.com/questions/8656683
复制相似问题