首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Basic JavaScript:()();

Basic JavaScript:()();
EN

Stack Overflow用户
提问于 2011-12-28 13:42:44
回答 5查看 166关注 0票数 2

可能重复:

javascript function vs. ( function() { … } ());

如果这是太基本的话,很抱歉,但是这个构造是做什么的?

代码语言:javascript
复制
(function MyFunction() {
  /* Some codes ... */    
})();

也许有一个特殊的术语吗?这对于谷歌搜索是有用的,而不仅仅是把这个片段放在搜索字段中。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-28 13:49:14

它被称为直接调用模式。它定义了一个匿名函数,然后立即执行它。这对于“私有”变量和诸如此类的变量非常有用。如果你通常这样做的话:

代码语言:javascript
复制
// global namespace
var data = 'lol';
function getData() {
  return data;
}

全局命名空间中会有一个变量数据,如果有人在web控制台中输入data = 123,它可能会破坏您的脚本。使用直接调用模式,您可以这样做:

代码语言:javascript
复制
// global namespace
/*lotsofcodehere*/
(function MyFunction() {
  // closure namespace
  var data = 'lol';
  this.getData = function getData() {
    return data;
  }
})();
// global again

在这种情况下,函数getData仍然存在于全局命名空间中,但是数据将无法从闭包命名空间外部访问。

在使用此模式时,您还会注意到全局命名空间中不存在MyFunction。这是因为有许多小的语言规则之一,但基本上,函数的名称在函数中总是可用的。如果你有这样的东西:

代码语言:javascript
复制
// 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不再可以通过全局命名空间访问)。

这可能不是一个现实的场景,但它适用于这个示例。我们将使用以下代码来代替上面的代码:

代码语言:javascript
复制
/*code*/
this.countToZero = function countToZero(from) {
  // countToZero will *always* exist here as a reference to this function!
  /*code*/
  return countToZero(from);
};

这段代码很难破译,当然,如果您将Infinity作为第一个param传递,即使您以完全荒谬的方式使用它也是如此。

..。

我是说我要给出清晰的解释还是很好的真实的例子?我希望我没有

票数 6
EN

Stack Overflow用户

发布于 2011-12-28 13:44:29

它创建并执行函数MyFunction,而不将其放置在全局命名空间中。这是避免名称空间污染的一个好方法。一旦执行,就不能再执行了,因为它实际上并没有被保存到任何地方。

票数 4
EN

Stack Overflow用户

发布于 2011-12-28 13:46:06

这基本上会调用MyFunction()中的代码,而不会将其添加到全局命名空间中,不用说,在MyFunction中定义的变量也不会在全局名称空间中可用。

我在大多数情况下都看到了这种构造,同时需要执行一段具有需要隐藏的递归逻辑的代码,例如遍历某些子文档到页面。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8656683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档