クローズドパッケージ問題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
答えはたくさんありますが、具体的には以下の通りです.
この3つ、私自身が考えているのは2つ目で、他はすべて探しています.それからネット上にes 6の書き方があります.
その时、この解釈を见て少し愚かで、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サイクルにのみ有効です.通常のコードでは、このように宣言するとエラーが表示されます.
直接エラーを報告します.iはすでに存在し、再宣言できません.
これでは結果は1,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なので無効です.他のサイクルはテストしたことがないので、どのように設計するか思い出せません.誰かが研究してほしい.