目录
3.1.1 let声明
在函数作用域或全局作用域中通过关键字var声明的变量,无论在哪里声明,都会被当成在当前作用域顶部声明的变量,这就是JavaScript的变量提升机制。代码如下所示:
// 函数内部
function changeState(flag){
if(flag){
var color = "red";
}else{
console.log(color); // 值为undefined
}
}
changeState(false)
// 块中
{
var a = 1
}
console.log("a="+a) // a+1
// 循环中
for(var i=0;i<10;i++){
}
console.log("i="+i) // i=10
3.1.2 const声明
ES6 提供了const 关键字,用于声明常量。每个const关键字声明的常量必须在声明的时候同时初始化。代码如下所示:
const sizeOfPage = 10; // 正确
const maxItems; // 错误
如果使用const声明对象,对象本身的绑定不能修改绑定,但对象的属性值是可以修改的,代码如下所示:
const person = {
name:"zhangsan"
}
person.name = "lisi"; // ok
person.age = 20; // ok
// 报错,"Uncaught TypeError: Assignment to constant variable."
person = {
name:"wangwu"
}
3.1.3 全局作用域绑定
在全局作用域中使用var声明的变量或者对象,将作为浏览器环境中的window对象的属性,这意味着使用var很可能会无意中覆盖一个已经存在的属性。例如:
var greeting = "Welcome";
console.log(window.greeting); // Welcome
console.log(window.Screen); // function Screen() { [native code] }
var Screen = "hello world";
console.log(window.Screen); // hello world
greeting 被定义为一个全局变量,并立即成为window对象的属性。定义的全局变量Screen则覆盖了window对象中原有的Screen属性。
如果在全局作用域下使用let或者const,则会在全局作用域下创建一个新的绑定,该绑定不会成为window对象的属性。代码如下所示:
let greeting = "Welcome";
console.log(window.greeting); // undefined
let Screen = "hello world";
console.log(Screen === window.Screen); // false
综上所述,如果不想为全局对象window创建属性,或者为了避免覆盖window对象的属性,则应该使用let和const声明变量和常量。