使用var可以定义局部变量。
function myFunc() { var message = "Hello"; var name = "John", email = "john@somewhere.com"; }
在执行程序时,ECMAScript自动将var变量移动到当前作用域的前面,这个机制叫做声明提升(declaration hoisting)。比如下面的代码:
function myFunc() { console.log(message); var message = "Hello"; }
在执行时被修改为:
function myFunc() { var message; console.log(message); message = "Hello"; }
因此不会抛出ReferenceError。
另一个定义变量的方法是使用let。let和var的用法相似,区别在于作用域、重复声明、变量提升、全局可见性、循环可见性等方面。
let变量的作用域是当前块(block scoped),var变量则是当前函数(function scoped):
function funcA(n) { if (n > 0) { var message = "positive"; } else { var message = "non-positive"; } console.log(message); // ok } function funcB(n) { if (n > 0) { let message = "positive"; } else { let message = "non-positive"; } console.log(message); // ReferenceError }
重复声明var变量是合法的,重复声明let变量不行。在同一个域中分别用var和let声明同名变量也是不允许的:
var x; var x; // ok let y; let y; // SyntaxError: Identifier 'y' has already been declared
var变量会自动提升,let变量不会:
function func1() { console.log(message); // ReferenceError: Cannot access 'message' before initialization let message = "Hello"; }
如果在全局上下文(global context)中生命,var变量会自动成为window对象的属性,let变量不会:
// global context var name = 'John'; console.log(window.name); let age = 18; console.log(window.age); // undefined
var或let的一个重要区别是,在for循环中,迭代控制变量必须是let。虽然从语法上来说可以用var,但这未必是你想要的结果。
for (var i = 1; i < 5; i++) { console.log(i); // 1 2 3 4 setTimeout(() => console.log(i), 0); // 5 5 5 5 } console.log(i); // 5 for (let j = 1; j < 5; j++) { console.log(j); // 1 2 3 4 setTimeout(() => console.log(j), 0); // 1 2 3 4 } console.log(j); // undefined
const是let的常量版本。使用const时必须对变量进行初始化,而且const变量不能被再次赋值。这里要注意的是,const保持引用不变,不能被二次赋值,但const引用的对象,其属性是可以修改的。
const name = "John"; const name = "Alice"; // SyntaxError const user = {}; user.name = "John"; // ok
来源:oschina
链接:https://my.oschina.net/u/131191/blog/3197691