(Translated by https://www.hiragana.jp/)
立即调用函数表达式 - 维基百科,自由的百科全书 とべ转到内容ないよう

たてそく调用函数かんすうひょう达式

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん

たてそく调用函数かんすうひょう达式英文えいぶんimmediately-invoked function expression,缩写:IIFE[1]いち利用りようJavaScript函数かんすう生成せいせいしん作用さよういきてき编程方法ほうほう

たてそく调用函数かんすうひょう达式以令其函すうちゅう声明せいめいてき变量绕过JavaScriptてき变量おけ声明せいめい规则,还可以避めんしんてき变量かい释成全域ぜんいき变量ある函数かんすうめいうらないよう全域ぜんいき变量めいてきじょう况。あずか此同时它のうざい禁止きんし访问函数かんすうない声明せいめい变量てきじょう况下まこと许外对函すうてき调用。ゆう时,这种编程方法ほうほう也被さけべ做“执行(匿名とくめい函数かんすう”,ただしたてそく调用函数かんすうひょう达式”语义じょうさいじゅん确的术语。 [2][1][3][4]

用法ようほう

[编辑]

たてそく调用函数かんすうひょう达式拥有すう不同ふどうてきうつしほう[5]さいつね见的一种是将函数表达式字面量置于圆括号(ぶん组运さんこれないしかきさき使用しよう圆括ごう调用函数かんすう[6][7]

(function() {
  // 这里てき语句はた获得しんてき作用さよういき
})();

わかようしょう作用さよう域外いきがい变量传递进函すう,则按じゅつ方式ほうしき书写:

(function(a, b) {
  // a == 'hello'
  // b == 'world'
})('hello', 'world');

开头てきくくごう可能かのうかいいん为解释器てきぶんごう插入そうにゅう特性とくせい造成ぞうせいいち些问题。くくごうほんよう于明确字めんりょう为表达式以与函数かんすう声明せいめい语句区分くぶんただしかい释器可能かのうはたくくごうかい释为对以じょう一行中结尾的变量名为名的函数的调用。ざい一些省略分号的程序中,见将ぶんごういたり于行くびてき做法。这样てきぶんごうしょう为“防御ぼうぎょ性分しょうぶんごう[8][9],举例:

a = b + c
;(function() {  // 故意こいしょうぶんごうざい这里
  // だい
})();

如此书写,以防止ぼうし语句理解りかい为对函数かんすうcてき调用(c(...))。

れい

[编辑]

理解りかいりつそく调用函数かんすうひょう达式てき关键ざい于认きよしJavaScript拥有函数かんすう作用さよういきただしぼっゆう块作よういき(ES6まえ),且通过指针(而非复制)はた变量传入いち个函すう闭包[10] ES6 引入りょうしん关键 let const,よう它们てい义的つねりょう变量具有ぐゆう块级作用さよういき

もとめ上下じょうげぶん(Evaluation context)

[编辑]

かけしょう块作よういき意味いみ一个在类似于for循环てき块中声明せいめいてき变量かいおけ顶到其所包含ほうがんてき函数かんすうちゅう。如果一个内部函数依赖于一个外部变量,而该外部がいぶ变量外部がいぶ函数かんすう更改こうかい么执行内こうない函数かんすう就有些困难。举例,わが们在声明せいめい函数かんすうきさきただしざいてい义函すうまえあらため变一个变量的りょうてき值。[11]

var v, getValue;
v = 1;
getValue = function() { return v; };
v = 2;
 
getValue(); // 2

とうわが们手动给v赋值时这结果乎没什么问题。过,如果getValue()ざい一个循环中被定义的,么就可能かのう现预そう外的がいてき结果。

var v, getValue;
v = 1;
getValue = (function(x) {
  return function() { return x; };
})(v);
v = 2;

getValue(); // 1

此例ちゅう,functionしょう v さく为参すう传入并立そく调用,护了内部ないぶ函数かんすうてき执行上下じょうげぶん[12]

David Herman's作品さくひん Effective JavaScript 包含ほうがんりょう一个用来在循环中求值导致问题的例子。[13] 虽然てきれいこく编写どく非常ひじょう复杂,ただし原因げんいん缺乏けつぼう块作よういき导致てき.[14]

利用りようIIFE建立こんりゅう真正しんせいてき私有しゆう函数かんすう变量,并用闭包访问

[编辑]

たてそく调用函数かんすうひょう达式也可以用らい创建私有しゆう方法ほうほうらい访问函数かんすう仅起いた护作ようどう时也暴露ばくろりょう一些可以后续使用的属性。[15] 下面かめんてきれい子来こらい于 Alman's 关于IIFEてき网帖。[1]

// 'counter' 函数かんすうかえしかい一个具有属性的对象, 这里てき属性ぞくせい就是
// get setとう函数かんすう
var counter = (function(){
  var i = 0;

  return {
    get: function(){
      return i;
    },
    set: function( val ){
      i = val;
    },
    increment: function() {
      return ++i;
    }
  };
})();
// 这些调用使用しようりょう刚才counterいたてき属性ぞくせい
counter.get(); // 0
counter.set( 3 );
counter.increment(); // 4
counter.increment(); // 5

如果わが们试图从全局ぜんきょく作用さよういき直接ちょくせつ访问 counter.i会得えとくいた undefined,いんi 这个すうすえゆかりIIFEふうそう,它并 counterてき属性ぞくせいどう样的,如果わが们试图访问 i 也会おさむいた错误,いんi 并没ゆうざい全局ぜんきょく作用さよういきちゅうてい义。

术语

[编辑]

"りつそく调用函数かんすうひょう达式" 最早もはやたたえ为“执行(匿名とくめい函数かんすう[1][5] ただしりつそく执行てき函数かんすう一定いってい匿名とくめいてきECMAScript 5てき strict mode 禁止きんしarguments.callee,[16] いん此,这个术语够准确.[3][12]

ざいlambda-calculus(λらむだ演算えんざんちゅう,这个构造しょう为 "redex", ようらい简表达式, まいり阅:Reduction strategy (code optimization).

参考さんこう

[编辑]
  1. ^ 1.0 1.1 1.2 1.3 Alman, Ben. Immediately Invoked Function Expressions. 2010 [4 February 2013]. (原始げんし内容ないようそん档于2013-01-20). 
  2. ^ Resig, John. Pro JavaScript Techniques. Apress. 2006: 29. ISBN 9781430202837. 
  3. ^ 3.0 3.1 Osmani, Addy. Learning JavaScript Design Patterns. O'Reilly. 2012: 206. ISBN 9781449334871. 
  4. ^ Baagoe, Johannes. Closing parenthesis in function's definition followed by its call. [19 April 2010]. (原始げんし内容ないようそん档于2011-01-22). 
  5. ^ 5.0 5.1 Lindley, Cody. JavaScript Enlightenment. O'Reilly. 2013: 61. ISBN 9781449342883. 
  6. ^ Zakas, Nicholas. Maintainable JavaScript. O'Reilly. 2012: 44. ISBN 9781449327682. 
  7. ^ Crockford, Douglas. Code Conventions for the JavaScript Programming Language. [3 February 2013]. (原始げんし内容ないようそん档于2012-03-05). 
  8. ^ "JavaScript Semicolon Insertion: Everything you need to know页面そん档备份そん互联网档あん)", Friday, May 28, 2010
  9. ^ "Semicolons in JavaScript are optional页面そん档备份そん互联网档あん)", by Mislav Marohnić, 07 May 2010
  10. ^ Haverbeke, Marijn. Eloquent JavaScript. No Starch Press. 2011: 29–30. ISBN 9781593272821. 
  11. ^ Alman, Ben. simple-iife-example.js. Github. [5 February 2013]. (原始げんし内容ないようそん档于2021-04-14). 
  12. ^ 12.0 12.1 Otero, Cesar; Larsen, Rob. Professional jQuery. John Wiley & Sons. 2012: 31. ISBN 9781118222119. 
  13. ^ Herman, David. Effective Javascript. Addison-Wesley. 2012: 44–45. ISBN 9780321812186. 
  14. ^ Zakas, Nicholas C. Mimicking Block Scope. Professional JavaScript for Web Developers. John Wiley & Sons. 2011. ISBN 9781118233092. 
  15. ^ Rettig, Pascal. Professional HTML5 Mobile Game Development. John Wiley & Sons. 2012: 145. ISBN 9781118301333. 
  16. ^ Strict mode. Mozilla JavaScript Reference. Mozilla Developer Network. [4 February 2013]. (原始げんし内容ないようそん档于2013-05-25). 

外部がいぶ链接

[编辑]