Open Yang03 opened 8 years ago
let 允许把变量的作用域限制在块级域中。与 var 不同处是:var 申明变量要么是全局的,要么是函数级的,而无法是块级的。
var a = 5; var b = 10; if (a === 5) { let a = 4; var b = 1; console.log(a); // 4 console.log(b); // 1 } console.log(a); // 5 console.log(b); // 1
在用到内部函数的时候,let 可能有助于让代码更简洁
let callbacks = [] for (let i = 0; i <= 2; i++) { callbacks[i] = function () { return i * 2 } } // callback[0]() == 0 // callback[1]() == 2 // callback[2]() == 4
i 变成块级域(也就是花括号中的块,每进入一次花括号就生成了一个块级域),所以3个内部函数指向了不同的 i 如果上面这段时var 时
var callbacks = [] for (var j = 0; j <= 2; i++) { callbacks[j] = function () { return j * 2 } } // callback[0]() == 6 // callback[1]() == 6 // callback[2]() == 6
因为 j 是函数级变量,3个内部函数都指向了同一个 j ,而 j 最后一次赋值是3。 当 callbacks 被调用的时候,匿名函数保持对外部变量 j 的引用,此时 for循环已经结束, j 的值被修改成了 3.
如果需要改写
var callbacks = [] for (var j = 0; j <= 2; i++) { (function(i){ callbacks[i] = function () { return i * 2 } })(j) } // callback[0]() == 0 // callback[1]() == 2 // callback[2]() == 4
外部的匿名函数会立即执行,并把 j 作为它的参数,此时函数内 i 变量就拥有了 j 的一个拷贝
let
let 允许把变量的作用域限制在块级域中。与 var 不同处是:var 申明变量要么是全局的,要么是函数级的,而无法是块级的。
在用到内部函数的时候,let 可能有助于让代码更简洁
i 变成块级域(也就是花括号中的块,每进入一次花括号就生成了一个块级域),所以3个内部函数指向了不同的 i 如果上面这段时var 时
因为 j 是函数级变量,3个内部函数都指向了同一个 j ,而 j 最后一次赋值是3。 当 callbacks 被调用的时候,匿名函数保持对外部变量 j 的引用,此时 for循环已经结束, j 的值被修改成了 3.
如果需要改写
外部的匿名函数会立即执行,并把 j 作为它的参数,此时函数内 i 变量就拥有了 j 的一个拷贝