2016-08-10 2 views
1

私はDouglas CrockfordのJavaScript講義シリーズを進めています。私は、彼が「閉鎖」を示すために表示されているコード例で混乱しています:JavaScriptのクロージャ:関数を返す

var digit_name = (function() { 
 
    var names = ['zero', 'one', 'two', 'three']; 
 
    
 
    return function (n) { 
 
    return names[n]; 
 
    }; 
 
    
 
}()); 
 

 
alert(digit_name(3));

どう

/digit_nameパラメータが定義で指定されていない引数(一番外側の関数)を取ることができる理由?引数(この場合は3)は、呼び出し時に内部関数定義内のnに対応することをどのように知っていますか?

+0

定義されているときは、IIFEです。 – gcampbell

答えて

2

digit_name店舗内関数は一つのパラメータを用いて署名を有し、それはdigit_nameに格納されている何直ちに実行関数式外関数によって内部機能return ED。

function (n) { 
    return names[n]; 
} 

最終的には、上記digit_nameなり、namesdigit_nameの環境にバンドルされているプラ​​イベート変数、です。プライベート変数の概念は、クロージャを使用してのみ可能です。それを明確に、この参照ようにするに

enter image description here

0

)は(自己呼び出し、無名関数(関数(){})Theresの。だから、digit_nameは、関数ではありませんその内の関数の出力は、これはブラウザ内で起こるstatement.Soを返すが何であるか:

var digit_name=(function(){})(); 
var digit_name=function(n){} 
0

外側の関数は、生命維持、すぐに、呼び出された関数式です。この関数は、スクリプトが開始されたときに実行されるため、IIFEによって返される内部関数はdigit_nameに割り当てられた関数です。

この内部関数が依然としてクロージャ内のすべてのもの(名前配列など)にアクセスできる場合、クロージャの「魔法」。

https://developer.mozilla.org/en-US/docs/Glossary/IIFE

+0

...内部関数はパラメータをとる関数を返します。 –

+0

はい、私は内部関数が返されたものであることを指定するべきでした。 –

関連する問題