13.使用當即調用的函數表達式建立局部做用域

閉包存儲的是其外部變量的引用而不是值。bash

function warpElements(a) {
    var result = [],
        i, n;
    for (i = 0, n = a.length; i < n; i++) {
        // console.log(i);
        result[i] = function() {
            // console.log(i);
            return a[i];
        }
       // console.log(`result[${i}]:${result[i]}`);
    }
    // console.log(result);
    return result;
}
var warpped = warpElements([10, 20, 30, 40, 50]);
var f = warpped[0];
f(); // undefined
複製代碼

經過當即調用的函數表達式來建立一個局部做用域。閉包

function warpElements(a) {
    var result = [],
        i, n;
    for (i = 0, n = a.length; i < n; i++) {
        (function(j) {
            result[i] = function() {
                return a[j];
            }
        })(i)
    }
    return result;
}
var warpped = warpElements([10, 20, 30, 40, 50]);
var f = warpped[0];
f();
複製代碼

提示

  • 理解綁定與賦值的區別。
  • 閉包經過引用而不是值捕獲它們的外部變量。
  • 使用當即調用的函數表達式(IIFE)來建立局部做用域。
  • 小心在當即調用的函數表達式中包裹代碼塊可能改變其行爲的情形。
相關文章
相關標籤/搜索