严格模式:'use strict’
1.在<script>
里面的第一行写'use strict';
,表明下面代码都是使用严格模式
2.使代码的定义、使用更加规范,避免一些诡异的运行行为
3.在后续的ES特性和一些Angular等JS框架中,要求必须要在严格模式下运行
4.使代码的编译和运行更加高效(避免代码产生一些不必要的麻烦)
对变量的影响
1、变量必须要先声明再使用
i = 10; // 严格模式:抛ReferenceError异常
console.log(i); // 非严格模式:正常声明,正常打印
2、不可以使用implements
,interface
,let
,package
,private
等保留字/关键字作为变量名
var private = 100; // 严格模式:抛SyntaxError异常 非严格模式:正常声明
3、严格模式不再允许用户删除变量
var i = 10;
console.log(delete i); // 严格模式:抛SyntaxError异常 非严格模式:false
console.log(i); // 非严格模式:10
对对象的影响
1、为只读属性赋值会抛出TypeError
2、对不可配置的属性使用delete 操作符会抛出TypeError
3、对不可扩展的对象添加属性会抛出TypeError
4、不可以使用with简化对象访问(为什么?)
var obj = {id: 1, name: "Tom"};
with(obj) {
// 这里addr属性有歧义
addr = "nanjing"; // 严格模式:抛SyntaxError异常,所以后面的不走了
name = "Sophia";
document.write(id); // 非严格模式:1
document.write(name); // 非严格模式:Sophia
document.write(addr); // 非严格模式:nanjing
}
document.write(obj.name); // 非严格模式:Sophia
console.log(obj.addr); // 非严格模式:undefined
对函数的影响
1、在普通函数中,不允许使用this
引用当前windows
对象
function test() {
console.log(this); // 严格模式:undefined 非严格模式:输出window对象
}
test();
2、在严格模式中,函数的参数必须唯一
// 非严格模式:没有错误,只能访问第二个参数,如果要访问第一个参数,就必须通过arguments
function sum(num,num){ // 严格模式:抛SyntaxError异常
console.log(num); // 非严格模式:2
console.log(arguments[0]); // 非严格模式:1
}
sum(1,2);
3、在严格模式下arguments对象的行为也有所不同.在严格模式下,修改命名参数的值也会反映到argument对象中,但是在严格模式下这两个值是完全独立的
function showValue(value){
value = 'foo';
console.log(value); // 严格模式:foo 非严格模式:foo
console.log(arguments[0]); // 严格模式:hello 非严格模式:foo
}
showValue('hello')
4、eval函数最大的变化就是他在包含上下文中不在创建变量或者函数
var str = "var j = 100";
eval(str);
console.log(j); // 非严格模式:100 严格模式:j is not defined
5、只要在<script>
中声明了严格模式,那么所有在此<script>
中声明的函数也适用严格模式!如果<script>
中不声明严格模式,函数的方法体中也可以自己声明,只对改方法里面起作用。
function test() {
"use strict";
i = 10; // 属于严格模式范围 i is not defined
}
a = 20;
console.log(a); // 属于非严格模式范围 20
test();
获取视频:阅读原文
个人公众号: