JSにおけるスコープの問題
2506 ワード
今日は慕課のネットで勉強しました.この文章のjavascriptの関数表現を見ました.のうち、最初の出力555の例はよく分かります.forループが終了すると、iはすでに5になり、リセット[j]が起動されると、関数が定義関数を使用する場合の作用領域、i=5となり、出力は5になります. の2番目の最初は最初と最初の違いが分かりませんでしたが、ES 5のJSにはブロックレベルの作用領域がないことが分かりました.関数の作用領域だけがあります.forサイクルはiを再定義して使用しました.iは再変更されましたので、出力01234です. 第三のよく分かりました.ES 6にはletキーワードが定義されています.ブロックレベルのスコープ変数を定義します.具体的には、阮一峰先生のブログを参照してください.forのiは外層のiを修正しないので、出力555でもある. ブロックレベルのスコープをシミュレートするには、
function createFunctions() {
'use strict'
var result = []
for (var i = 0; i < 5; i++) {
result[i] = function() {
return i
}
}
for (var j = 0; j < 5; j++) {
console.info(result[j]()) // 5 5 5 5 5
}
for (var i = 0; i < 5; i++) {
console.info(result[i]()) // 0 1 2 3 4
}
for (let i = 0; i < 5; i++) {
console.info(result[i]()) // 5 5 5 5 5
}
return result
}
createFunctions()
(IIFE)
を使用することができる.PS:前の問題でよく見られたようです. for (var i = 0; i < 5; i++) {
result[i] = (function(num) {
return num
})(i)
}
以前のfunctionをIIIIIIIFEに変えて、result[i]を呼び出すたびに、result[i]は関数を定義する際の作用域を使用して、伝達されたnumは当時iの値です.