javascript的严格模式与有什么特点?
javascript的严格模式与有什么特点?
- 开启严格模式
- 严格模式中的变化
- 1. 全局变量显示声明
- 2、禁止使用with语句
- 3、创设eval作用域
- 4、禁止this指向全局对象(定时器的this还是指向window)
- 5、显式报错
开启严格模式
//全局开启了严格模式
"use strict";
function fn(){
//当前fn函数开启了严格模式
"use strict";
return "123";
}
严格模式中的变化
1. 全局变量显示声明
'use strict'
num = 10
console.log(num)// 报错,num未声明
报错,num未声明
2、禁止使用with语句
function f(x, o) {
with(o) {
console.log(x)
}
}
f(null, {x:3}) // 3
// with 语句
// 弊端:代码不易阅读,易混淆,程序在查找变量值时,先从指定的对象里找,那些不是指定对象的变量查找起来会很慢。
// 优点:减少不必要的指针路径解析运算
使用了with之后,在with里面x就专指o里面的x
弊端:代码不易阅读,易混淆,程序在查找变量值时,先从指定的对象里找,那些不是指定对象的变量查找起来会很慢。
优点:减少不必要的指针路径解析运算。
3、创设eval作用域
严格模式创设额外的作用域,正常模式下,eval作用域取决于它处于全局作用域还是函数作用域。严格模式下,eval语句本身就是一个作用域,不再生成全局变量,生成的变量只能用于eval内部。
'use strict'
var x = 2
console.info(eval('var x = 5; x')) // 5, 将计算js字符串,将其作为脚本代码来执行
console.log(x) // 2
4、禁止this指向全局对象(定时器的this还是指向window)
严格模式下,不指向window就指向undefined
function Star() {
this.sex = '男';
}
Star(); // 4. 严格模式下,如果构造函数不加new调用, this 指向undefined, 赋值则会报错.
var ldh = new Star();
console.log(ldh.sex);
5、显式报错
1、正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败;严格模式下会报错。
2、严格模式下,对一个使用getter方法读取的属性进行赋值,会报错
3、对禁止扩展的对象添加新属性
4、删除不可删除的属性