Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

var let const #3

Open
Yang03 opened this issue Sep 10, 2015 · 0 comments
Open

var let const #3

Yang03 opened this issue Sep 10, 2015 · 0 comments

Comments

@Yang03
Copy link
Owner

Yang03 commented Sep 10, 2015

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

@Yang03 Yang03 changed the title es6中的let var let const May 1, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant