JavaScript 变量提升
JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。
1 | x = 5; // 变量 x 设置为 5 |
1 | var x; // 声明 x |
以上两个例子皆可执行,不会报错。因为第一个例子进行了变量提升。
变量提升:函数声明和变量声明总是会被解释器悄悄地被”提升”到方法体的最顶部。
1 | ; |
JavaScript 初始化不会提升
JavaScript 仅提升声明,而不提升初始化
1 | var x = 5; // 初始化 x |
1 | var x = 5; // 初始化 x |
第二个实例的 y 输出了 undefined,这是因为变量声明 (var y) 提升了,但是初始化(y = 7) 并不会提升,所以 y 变量是一个未定义的变量。
相当于:
1 | var x = 5; // 初始化 x |
JavaScript 变量提升
JavaScript可以进行变量提升,也可以进行函数提升。
1 | console.log(foo1); // [Function: foo1] |
但函数提升只会提升函数声明,而不会提升函数表达式。
JavaScript 严格模式
JavaScript 严格模式(strict mode)即在严格的条件下运行。
通过use strict指令指定代码在严格条件下执行。
严格模式下不能使用未声明的变量。
严格模式声明
严格模式通过在脚本或函数的头部添加 use strict; 表达式来声明。
为什么使用严格模式?
- 消除代码运行的一些不合理、不严谨、不安全之处,保证代码运行的安全
- 提高编译器效率,增加运行速度
- 减少一些怪异行为
严格模式的限制
1.不允许使用未声明的变量
1 | ; |
对象也是一个变量,在严格模式下同样受限
1 | ; |
2.不允许删除变量或对象
1 | ; |
3.不允许删除函数
1 | ; |
4.不允许变量重名
1 | ; |
5.不允许使用八进制
1 | ; |
6.不允许使用转义字符
1 | ; |
7.不允许对只读属性赋值
1 | ; |
8.不允许对一个使用getter方法读取的属性进行赋值
1 | ; |
9.不允许删除一个不允许删除的属性
1 | ; |
10.变量名不能使用 “eval” 字符串
1 | ; |
11.变量名不能使用 “arguments” 字符串
1 | ; |
12.由于一些安全原因,在作用域 eval() 创建的变量不能被调用
1 | ; |
13.禁止this关键字指向全局对象
1 | function f(){ |
使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。
1 | function f(){ |
保留关键字
严格模式新增了一些保留关键字,变量名使用保留关键字时将会报错。
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
1 | ; |
“use strict” 指令只允许出现在脚本或函数的开头。