Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这种做法在JavaScript中称为什么?_Javascript_Design Patterns_Terminology_Iife - Fatal编程技术网

这种做法在JavaScript中称为什么?

这种做法在JavaScript中称为什么?,javascript,design-patterns,terminology,iife,Javascript,Design Patterns,Terminology,Iife,当您将JavaScript代码包装到如下函数中时: (function(){ var field = ...; function doSomthing(){... ... })(); // Hello, my name is "foo". I am a named function. // When I am invoked I invoke my self when I am invoked. function foo(){ foo(); } // Hello, I

当您将JavaScript代码包装到如下函数中时:

(function(){

  var field = ...;
  function doSomthing(){...
  ...


})();
// Hello, my name is "foo". I am a named function.
// When I am invoked I invoke my self when I am invoked.
function foo(){
   foo();
}
// Hello, I have no name...
//   (though I am assigned to the variable "foo" it's not who I am).
// When I am invoked I invoke my self when I am invoked.
// In ECMAScript 5 I no longer work. :-(
var foo = function(){
    arguments.callee();
};
// Hello, I have no name. I am immediately invoked.
// People sometimes call me a "self-invoking anonymous function"...
//    even though I don't invoke myself.
// Ben Alman calls me an "Immediately-Invoked Function Expression"...
//    or "iffy" for short.
(function(){ /...code.../ }());

我注意到这为我解决了很多网页上的范围界定问题。这种做法叫什么?

为了澄清下面的评论,大多数时候,它是在创建一个闭包,它将变量的范围限定在该局部闭包上,而不是创建全局变量,它既保持了事情的整洁,又避免了对这些变量进行任何潜在的不必要的更改

这里有一些很好的答案可以解释更多的原因:

这只是一个创建闭包的过程,当该范围内的某些内容暴露给外部范围时,通常情况就是这样,但是我不能确定在没有看到更多代码的情况下您的示例。如果没有公开任何内容,那么就不会创建闭包……否则它只是一个立即执行的匿名函数


})()末尾的格式,而不是
})
实际上是调用该闭包来立即执行,没有任何参数。如果你有东西在里面,例如
}(某物)
然后将
something
作为第一个参数传递到这里:
(function(somethingParam){

包装函数称为匿名(它没有名字,也没有分配给变量)自执行(它自己立即执行)函数


我不记得看到这个模式的确切名称,但它可以防止变量泄漏到全局范围。

这个模式被称为自调用,一个自调用函数。它可以创建一个闭包,但这是模式的一个效果(可能是预期效果),而不是模式本身。

道格拉斯·克罗克福德和YUI团队称之为模式。

本·阿尔曼就这种“模式”的常用术语提出了一个有趣的论点

他的博客文章是关于它的

如果他的文章对你来说太长,这里是我的总结(我仍然建议你阅读,因为这个总结遗漏了很多):

如果希望命名函数能够自动执行/调用,则应如下所示:

(function(){

  var field = ...;
  function doSomthing(){...
  ...


})();
// Hello, my name is "foo". I am a named function.
// When I am invoked I invoke my self when I am invoked.
function foo(){
   foo();
}
// Hello, I have no name...
//   (though I am assigned to the variable "foo" it's not who I am).
// When I am invoked I invoke my self when I am invoked.
// In ECMAScript 5 I no longer work. :-(
var foo = function(){
    arguments.callee();
};
// Hello, I have no name. I am immediately invoked.
// People sometimes call me a "self-invoking anonymous function"...
//    even though I don't invoke myself.
// Ben Alman calls me an "Immediately-Invoked Function Expression"...
//    or "iffy" for short.
(function(){ /...code.../ }());
如果希望匿名函数能够自动执行/调用,则应如下所示:

(function(){

  var field = ...;
  function doSomthing(){...
  ...


})();
// Hello, my name is "foo". I am a named function.
// When I am invoked I invoke my self when I am invoked.
function foo(){
   foo();
}
// Hello, I have no name...
//   (though I am assigned to the variable "foo" it's not who I am).
// When I am invoked I invoke my self when I am invoked.
// In ECMAScript 5 I no longer work. :-(
var foo = function(){
    arguments.callee();
};
// Hello, I have no name. I am immediately invoked.
// People sometimes call me a "self-invoking anonymous function"...
//    even though I don't invoke myself.
// Ben Alman calls me an "Immediately-Invoked Function Expression"...
//    or "iffy" for short.
(function(){ /...code.../ }());
如果希望立即执行/调用匿名函数,则应如下所示:

(function(){

  var field = ...;
  function doSomthing(){...
  ...


})();
// Hello, my name is "foo". I am a named function.
// When I am invoked I invoke my self when I am invoked.
function foo(){
   foo();
}
// Hello, I have no name...
//   (though I am assigned to the variable "foo" it's not who I am).
// When I am invoked I invoke my self when I am invoked.
// In ECMAScript 5 I no longer work. :-(
var foo = function(){
    arguments.callee();
};
// Hello, I have no name. I am immediately invoked.
// People sometimes call me a "self-invoking anonymous function"...
//    even though I don't invoke myself.
// Ben Alman calls me an "Immediately-Invoked Function Expression"...
//    or "iffy" for short.
(function(){ /...code.../ }());
我自己对这件事的看法是:

其他答案是正确的;您所询问的内容通常被称为“自调用匿名函数”。
然而,这个术语并不能准确地反映实际情况,“立即调用的函数表达式”(简称“iffy”)似乎是一个更合适的术语。


给朋友留下深刻印象的有趣事实:

您也可以创建一个类似这样的模糊模型:

!function(){
   alert("immediately invoked!");
}();

或者如果你真的疯了():


在大多数浏览器中(如果不是全部的话,我不确定),效果都是一样的(facebook使用的是
版本)。

它的出现时间比“模式”要长。这是scheme/lisp中的一个常见习惯用法,主要用于封装,尤其是在进行元编程时

这种做法叫什么

简言之,它被称为IIFE。它在表达式中定义了一个函数,然后它自己执行(不将函数分配给任何标识符)。它有时也被称为立即执行函数表达式(IEFE)

在Ben Alman在其博客上发表文章之前,这些函数也被称为自调用(匿名)函数,这一术语从那时起就变得不常见了。从技术上讲,这是不精确的,暗示着递归调用实际上并没有发生

有关语法的详细信息,请参阅和

我注意到这为我解决了很多网页上的范围界定问题

是的,就是通过执行一个函数来引入一个额外的作用域


该模式有时还使用返回值进行扩展,称为(显示)模块模式,或具有允许递归调用的函数名称。

严格来说,闭包是函数的副作用。这不是闭包,而是函数。事实上,在这种情况下,可能甚至没有创建闭包,因为函数的内容无法从外部访问。请参阅@Jani-这就是闭包确实……它专门用于(在本例中)对外部隐藏内容,同时让内部的任何东西都可以访问内容。即使您提供的链接也给出了这样一个确切的定义:“闭包的简单解释是ECMAScript允许内部函数;函数定义和函数表达式位于其他函数的函数内。这些内部函数允许访问外部函数内的所有局部变量、参数和声明的内部函数。“@Nick,您引用的这句话是指标识符解析过程的工作方式,而不是具体的闭包形式,继续引用:“当这些内部函数中的一个在包含它的函数外部可访问时,就形成了一个闭包,以便在外部函数返回后可以执行它。“因此,如果没有内部函数对外开放,就不会形成闭包,@Jani指出,在我看来,闭包这个术语现在有时被过度使用了。@Nick,是的,这个例子是不完整的。是的,在函数的情况下,你几乎总是向外部公开一些东西(或包含引用局部函数的属性的对象)闭包已经形成。谢谢你的澄清。@Nick:函数不是闭包。不要混淆术语。闭包是函数共享的变量。函数可以创建闭包,但它本身不是闭包。这就像把烤箱称为蛋糕。蛋糕不是烤箱,但烤箱可以用来烤蛋糕。我不确定如果你想立即执行代码(而不是闭门造车),你可以称之为副作用