浅谈js变量和作用域

217 阅读1分钟

作用域

在es6之前,js没有块级作用域,只有全局作用域和函数作用域,在函数内声明的变量是局部变量,只能在函数内部访问;在函数外部声明的变量是全局变量,可被文档中其他代码访问。es6增加了块级作用域,用let、const创建的变量为块作用域的局部变量。

变量

var声明的变量拥有变量提升,就是可以先使用变量,后声明,我们可以理解为js默认把变量提升到函数或语句的最前面。值得注意的是,因此在使用或引用某个变量之后进行声明和初始化操作,这个被提升的变量仍将返回 undefined 值。

console.log(i);       // undefined
var i = 5;

let声明的变量将不会提升变量,如果在声明之前使用,js会抛出异常。

const会创建一个只读常量,不可以在代码运行时重新声明,但是声明object、array 不受保护,依然可以修改里面的值。

对于函数来说,只有函数声明会被提升到顶部,而函数表达式不会被提升。