1

したがって、return function (n)最初に親関数に拡張として与えられた値を返します。しかし、nの値を渡していない場合、元の引数からその値を取得するので、理由がわかりvar digit_name = (function(){ません。return function(n){

特に私がそれを上書きしたのでvar n = 4;

JS

   var digit_name = (function(){
       var names;
       var n = 4;
       return function(n){
           if(!names){
               names = ['zero','one','two','three'];
           }
       return names[n];
       }
   }());
   console.info(digit_name(3)); //Three

return function(n)また、数字で上書きするとしreturn function(1)ますSyntaxError: missing formal parameter。戻り名[n]は何を知らnないので、n is undefinedエラーを出してみませんか?

4

3 に答える 3

2

あなたが何を求めているのか完全にはわからないので、なぜあなたがあなたがする出力を得るのかを説明するつもりです...

コードが実行されると、IIFE(即時呼び出し関数式)が実行され、digit_nameそこから返された関数を参照します。その関数は、クロージャを介して外部変数nと変数に引き続きアクセスできます。names

次に、呼び出しdigit_nameて引数を渡します。の仮パラメータdigit_nameは、であり、これは外部スコープで宣言されたnものをシャドウします。nそのアウターを参照する方法はもうありませんn。したがって、渡した値digit_nameはすべて使用されます。

事実上、この場合のIIFEは無意味であり(関数が呼び出されるたびに配列を作成する必要がないという事実を除けば)、コードは配列の違いを除いてこれと同等です。

var digit_name = function (n) {
    return ['zero','one','two','three'][n];
};
console.info(digit_name(3)); // "three"
于 2013-03-20T14:43:07.493 に答える
1

あなたの例では、変数との名前付けとスコープの衝突がありますn。外部関数で定義さvar nれた値には4の値が割り当てられます。内部関数は、として宣言された単一のパラメーターを受け入れますn。したがって、n内部関数の変数はその内部スコープを参照してvar nおり、外部関数では参照していません。デフォルト値が必要な場合は、外部変数に別の名前を付けてn、内部関数に値が存在するかどうかを確認できます。

var digit_name = (function () {
    var names;
    var defaultn = 0;
    return function (n) {
        if (!n) n = defaultn;
        if (!names) {
            names = ['zero', 'one', 'two', 'three'];
        }
        return names[n];
    }
}());
console.info(digit_name(3)); //Three
console.info(digit_name()); //zero
于 2013-03-20T14:41:38.873 に答える
1

コンソールでdigit_nameの定義を見ると、次の関数であることがわかります。

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

したがって、この関数内のnのスコープは、上記で宣言された変数ではなく、パラメーターnであるため、nを上書きしていません。

于 2013-03-20T14:41:23.410 に答える