一、作用域
-
全局作用域
变量在函数或代码块
{}
外定义 -
局部作用域
变量在函数内部定义的
-
块级作用域
{}
-
动态作用域
JS采用静态作用域:变量的作用域是在定义时决定的而不是执行时决定的。
动态作用域:只能在执行阶段才能决定变量的作用域。
二、、Let
-
全局作用域
变量在函数或代码块
{}
外定义 -
局部作用域
变量在函数内部定义的
-
块级作用域
{}
-
动态作用域
JS采用静态作用域:变量的作用域是在定义时决定的而不是执行时决定的。
动态作用域:只能在执行阶段才能决定变量的作用域。
三、Let
let 用来替代 var 的
因为var 有两个不足:
-
1、var会出现变量提升现象
-
2、var没有块级作用域
使用let声明的变量总结:
-
不属于全局对象window
-
不允许重复声明
-
不存在变量提升现象
-
拥有块级作用域
代码如下:
for(var i = 1; i <= 3; i++) { setTimeout(function(){ console.log(i); }, 1000); } // 希望i的值事1、2、3、至少提供2种方案:一种使用let,另一种使用闭包 for(let i = 1; i <= 3; i++) { setTimeout(function(){ console.log(i); }); } //js中,变量的作用域属于函数作用域,在函数执行完毕之后,他的作用域会销毁、内传也会被回收但由于闭包在函数内部创建一个子函数,且子函数可访问父函数中的作用域,即使父函数执行,作用域也不会被执行。 //闭包作用:可以阻止变量被回收 //缺点:比普通函数更加占用内存,可能会造成内存泄漏 for(var q=1; q<=3;q++){ (function(q){ seTimeout(()=?{ console.log(q) }) })(q) }
四、const
const 是专门用来声明常量,用来储存保持不变的数据。
使用const声明的常量总结:
- 常量一旦定义就不能修改
- 常量定义的时候必须赋值
- 不属于全局对象window
- 不存在变量提升现象
- 不允许重复声明
- 拥有块级作用域
在 ES5 中,如何定义一个常量呢?
其实可以使用
Object.defineProperty()
来实现定义常量。代码示例如下:Object.defineProperty(window, 'PI', { value: 3.1415, writable: false }); console.log(PI);