JS中的变量是函数作用域,在嵌套作用域中创建的变量可用于整个函数。
代码伺候:
如下:
function f1(){ var n = 5; if(true){ var n = 10; } console.log(n); // 10 } f1();
结果输出 10,原因是if语句中的变量 n 覆盖了外层的变量 n ;
在ES6中,改用let定义变量,
function f1(){ let n = 5; if(true){ let n = 10; } console.log(n); // 5 } f1();
输出结果是所期望的。
使用var声明变量和使用let声明变量的一个区别就在于,前者是函数作用域,后者是块级作用域额,而且是在块中所出现的位置上初始化。因此对于使用let声明的变量,你无法在声明之前进行访问。而使用var生命的变量,访问顺序并不重要。
function fooey(){ console.log(foo); let foo = 100; } fooey();
报错。下面看看使用var定义变量
function fooey(){ console.log(foo); var foo = 100; } fooey();
输出undefined
下面再看一个例子:
for(var i = 0; i<5; i++){ console.log('hello'+i); } console.log(i);
输出如下:
改用let定义变量:
for(let i = 0; i<5; i++){ console.log('hello'+i); } console.log(i);
输出如下:
因为i是let创建的,故其作用域被限制在for循环中,该变量在作用域中之外是不可见的。