var : 做用域是函数体的所有,声明变量提高
函数
console.log(num);//undefined var num = 2 //循环内变量过分共享 for (var i = 0; i < 4; i++) { alert(i);//0,1,2,3 } for (var i = 0; i < 4; i++) { setTimeout(function () { alert(i)//4,4,4,4 }, i * 100); }
循环自己及三次timeout回调均共享惟一的变量i。当循环结束执行时,i的值为4,此时回调还没有被触发.
因此当第一个timeout执行时,调用alert(i),此时i的值为4,因此最终弹出来的是4.code
let声明的变量拥有块级做用域,声明的全局变量不是全局对象的属性,声明的变量直到控制流到达该变量被定义的代码行时才会被装载,用let重定义变量会抛出一个语法错误
对象
var j = 100; for (let i = 0; i < 4; i++) { console.log(j)//not defined,暂时性死去,即便在该做用域外已经存在这个变量,若是做用域内须要使用 let、 const 再次声明,则必须提早,不然没法使用,直到声明后才可使用 setTimeout(function () { alert(i)//0、一、二、3,块级做用域 }, i * 100); let j = 0; //let j = 2;//SyntaxError,重定义变量会抛出一个语法错误 console.log(j)//0,0,0,0 } window.i//undefined,不是全局对象的属性
const声明的变量与let声明的变量相似,它们的不一样之处在于,const声明的变量只能够在声明时赋值,不可随意修改,不然会致使SyntaxError(语法错误).
作用域
const num = 1; num = 2;// Assignment to constant variable