用var,let,const声明变量作用域异同详解
var:用var声明的变量在该声明区域是可全局访问的。
let:let是ES6的新标准,用let声明的变量,只在声明该变量的块级区域可访问(区别于var的全局访问)。
以下面代码为例说明var与let的不同。
let num=9;var flag=10;/**块级变量声明 let*/function let_test(){ for(let i=0;i<4;i++){ var y=2; console.log("i="+i+","+"y="+y); } console.log("在函数 let_test中访问num"+","+"num="+num); console.log("for循环之外访问:y="+y); console.log("for循环之外访问:i"); console.log(i);}
前两行代码声明变量的方式都是全局变量,可在全局调用。
用let声明的变量i,属于块级变量,而用var声明的变量y属于“全局变量”(此时的全局是相对与let_test函数来说的,y是该函数中的全局变量),然后在for循环中打印i和y的值:
i=0,y=2
i=1,y=2
i=2,y=2
i=3,y=2
结果表明可正常访问,再来测试一下在for循环之外能否正常访问,在for循环打印i和y的值:
for循环之外访问:y=2
for循环之外访问:i
e:\vscode\hello\hanShu.js:35
console.log(i);
^
ReferenceError: i is not defined
结果表明,即使实在函数的"块级区域"声明的变量y也能在函数体内出该块级区域之外的地方访问,这就是var的神奇之处,一旦声明即为“全局变量”。而用i变量脱离了声明它的区域就不能访问了,let类型的变量妥妥的“局部变量”啊!
再来说说const,和Java一样,它是常量,一经赋值不可更改,而它的可访问域和let一样,不再多说。