ES5之严格模式
严格模式
形成严格模式
在作用域最前面添加"use strict"
严格模式 "use strict";
"use strict"
放在作用域最前面(全局作用域 函数作用域 匿名函数的自调用)
优点
消除javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
(1)全局变量要显式的声明,否则会报错;必须先声明变量然后再使用。
(2)创建eval()作用域
- 消除代码运行的一些不安全之处,保证代码运行的安全;
(禁止this关键字指向全局对象。)
- 提高编译器效率,提高运行速度;
- 为未来新版本的javascript做好铺垫。
具体严格模式
声明变量方面
- 在传统模式中,不通过关键词
var
直接声明变量不报错
a = 100;
console.log(a);
- 在严格模式中,不通过关键词
var
直接声明变量会报错
fn()
function fn() {
"use strict";
a = 100;
console.log(a); // 报错
}
eval()方面
eval() 接收一个字符串,把它当做js语句执行
- 在传统模式中,eval()中的声明的变量是全局的
var result = eval("1+1"); // eval 将传入的字符串按照 js语法执行
console.log(result);
- 在严格模式中 ,创建eval()作用域 ,eval()中的声明的变量是局部的
eval("function fn(){console.log(1111111)};fn()")
eval("var a = 100;");
console.log(a);
this指向方面
- 在传统模式中,this默认指向
window
- 在严格模式中,禁止函数指向window,默认指向
undefined
,但是这个说法不严谨,函数在调用的时候必须要有依存的对象,如果没有依存的对象,默认指向undefined
function fn() {
console.log(this);
}
fn(); // 此处函数调用时没有明显的依存关系 所以this 为undefined
window.fn();// 此处函数调用时函数fn经由window调用 所以this 为window
删除变量方面
- 在传统模式中,可以通过
delete
删除对象属性
- 在严格模式中,禁止删除变量(window对象的属性 => 严格模式中禁止删除对象的固有属性 configurable : false ),删除固有属性会报错
var a = 100;
delete a;
// 获取一个对象中所有属性的描述
var str - new String('hello');
var result = Object.getOwnPropertyDescriptors(obj);
console.log(result);
参数重复声明方面
- 在传统模式中,参数可以重复声明
- 在严格模式中,参数不允许重复声明
function fn(a,b,b){
console.log(a,b);
}
fn(1,2);