Yang03 / blog

0 stars 0 forks source link

var let const #3

Open Yang03 opened 8 years ago

Yang03 commented 8 years ago

let

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 的一个拷贝