クローズドパッケージ問題let実装

5869 ワード

これまで多くの閉包知識を知っていたが,まだ概念がはっきりしている.閉パケットとは,他の関数の内部変数を読み取ることができる関数である.通常、js関数の外部は関数内部の変数を読み取ることができないが、関数内部は関数外部の変数を読み取ることができる.関数内部の局所変数を得る必要があり、閉パッケージを使用する必要がある場合があります.その最大の用途は2つあり、1つは前述した関数内部を読み取ることができる変数であり、もう1つはこれらの変数の値を常にメモリに保持することである.簡単に言えば、Javascriptでは、内部関数(すなわち、関数定義と関数式が別の関数の関数内にある)を使用できます.また、これらの内部関数は、外部関数で宣言されたすべてのローカル変数、パラメータ、および宣言された他の内部関数にアクセスできます.このような内部関数の1つが、それらを含む外部関数の外で呼び出されると、閉パケットが形成される.
ここでは,実装関数makeClosuresを記述し,呼び出し後に次の条件を満たす:1,関数配列resultを返し,長さはarrと同じ2,resultのi番目の関数,すなわちresultiを実行し,結果はfn(arr[i])と同じ入力例:var arr=[1,2,3];var square = function (x) { return x * x; }; var funcs = makeClosures(arr, square); funcs1;
出力例:4
答えはたくさんありますが、具体的には以下の通りです.
//  《JavaScript      》     
function makeClosures(arr, fn) {
    var result = new Array();
    for(var i=0;ifunction(num){
            return function(){
                return fn(num);

            }
        }(arr[i]);
    }
    return result;
}
//  ES5 bind()  
function makeClosures(arr, fn) {
    var result = new Array();
    for(var i=0;inull,arr[i]);
    }
    return result;
}
//  forEach()
function makeClosures(arr, fn) {
    var result = new Array();
    arr.forEach(function(curr){
        result.push(function(){return fn(curr)});
    })
    return result;
}

この3つ、私自身が考えているのは2つ目で、他はすべて探しています.それからネット上にes 6の書き方があります.
function makeClosures(arr, fn) {   
    var result = new Array();
    for(let i=0;ifunction(){
            return fn(arr[i]); //let       let        ,       i                   
        };
    }
    return result;
}

その时、この解釈を见て少し愚かで、letとvarの区别を探して、しかし、やはり理解していません.私はletがブロックレベルの作用だと知っていますが、ここでどうしてこのように使うことができるのか分かりません.その後、チェン一峰先生の「ECMAScript 6入門」という本を見て疑問を解いてくれたので、ブスならもっと本を読まなければなりません.私は1冊買って、ひっくり返すことをお勧めします.私も初心者で、最近この本を完成するつもりです.
本の上でそう言った
変数iはletによって宣言され、現在のiは本サイクルでのみ有効であるため、各サイクルのiは実際には新しい変数であるため、最後に出力されるのは6である.各ループの変数iが再宣言されている場合、前のループの値をどのように知って、本ループの値を計算しますか?これはJavaScriptエンジン内部で前回のループの値が記憶されているため,本輪の変数iを初期化すると,前回のループに基づいて計算される.
var宣言の変数はforループ以外でもアクセス可能であり、i変数が最終的な値に変化した場合、fn(arr[i])は閉パケットアクセスであるが、同じiであるため、iは統一値である.letは毎回違うiに相当し、私の前の疑問はなぜ毎回新しいiなのに自増できるのか、本の中のその言葉で説明した.JavaScriptエンジン内部では前回のループの値が記憶され、本輪の変数iを初期化すると、前回のループに基づいて計算されます.だからこの答えもいいです.注意:JavaScriptエンジン内部では前回のループの値を記憶する、本輪の変数iを初期化すると、前回のループに基づいて計算する.この言葉はforサイクルにのみ有効です.通常のコードでは、このように宣言するとエラーが表示されます.
let i=0;i++;
console.log(i);
let i=0;i++;
console.log(i);

直接エラーを報告します.iはすでに存在し、再宣言できません.
let i=0;i++;
console.log(i);
 i=0;i++;
console.log(i);

これでは結果は1,1なので無効です.他のサイクルはテストしたことがないので、どのように設計するか思い出せません.誰かが研究してほしい.