var、let区别(变量提升、作用域)

1.var

作用范围:函数作用域,存在变量提升,即实际解析顺序与编码位置无关(赋值前预解析)。

2.let

作用范围:块级作用域,不存在变量提升,与大多数后端语言一样。

例1:

for (var i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log(i);
    }, 0);
}
//输出3 3 3

原因:var为函数作用域,for遍历只是将i的值不断变化,若把var改成let,则输出0 1 2,由于let为块级作用域,每一个i存在于不同的作用域,每个定时器里面的i不同。

例2:

function fun(n) {
    //var n=undefined;   n=(n=123);
    console.log(n); //123
    var n = 456;
    console.log(n); //456
}
var n = 123;
fun(n);

原因:实际运行顺序如注释所示,函数内部先定义n,然后将形参表的123给n,后赋值456;

例3:

function fun() {
    console.log(fun);
    fun = 456;
    console.log(fun);
}
var fun = 123;
fun();
//报错fun is not a function;

实际执行顺序:

var fun = undefined;
function fun = function;
function fun() {
    console.log(fun);
    fun = 456;
    console.log(fun);
}
fun = 123;
fun(); //报错fun is not a function;

 

你可能感兴趣的:(前端,javascript)