JSにおけるスコープの問題

2506 ワード

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