“use strict” 概念
“use stric” 是ES5引入的一个指令。指令不是语句(但非常相似)。"use strict"与常规语句有两个重要的区别。
- 不包含任何语言关键字:指令是由特殊字符串字面量构成的表达式语句。
- 只能出现在脚本或函数体的开头,位于所有其他真正的语句之前。
严格模式的几种情况:
“use strict” 指令的目的是表示它后面的代码是严格代码。
如果脚本中有"use strict"代码,则脚本的顶级代码是严格代码。
如果函数体在严格代码中定义的,或者函数体中有一个"use strict"指令,那么它就是严格代码。
如果严格模代码中调用了eval(),那么eval()的代码也是严格代码。
如果传给eval()重点字符串包括"use strict",那么对应的代码是严格代码。
出了显式声明为严格的代码,任何位于class体或ES6模块的代码都默认为严格代码。而无需吧"use strict"指令显式的写出来。
严格模式在严格模式下执行。严格模式是JavaScript的一个受限制的子集,这个子集修复了重要的语言缺陷,提供了更强的错误
检查,也增强了安全性。因为严格模式并不是默认的,那些使用语言中有缺陷的遗留特性的旧代码依然可正确运行。
严格模式与费严格模式的区别如下:
- **严格模式不允许使用with语句
- 在严格模式下,所有变量必须声明。如果把值赋给一个标识符,而这个标识符是没有声明的变量、函数、函数参数、catch子句参数或全局对象的属性,都会导致抛出一个ReferenceError
- 在严格模式下,函数如果作为函数而调用,其this为undefined(非严格模式下,this为全局对象)。另外在严格模式下,如果函数通过call()或者apply()的值,则this的值就是作为第一个参数传给call或apply的值(非严格模式下,null,undefined值会被替换为全局对象,而非对象值会被替换为对象)
- 在严格模式下,给不可编写的属性赋值或尝试在不可扩展的对象上创建新属性会抛出typeError(非严格模式静默失败)
- 在严格模式下,传给eval的代码不能像非严格模式下那样在调用者的作用域中声明变量或定义函数。这种情况下定义的变量和函数就会存在一个为eval创建的新作用域中,并在eval返回时销毁
- 在严格模式下,函数中的arguments对象保存着一份传给函数的值的静态副本,在非严格模式下,arguments对象具有魔法行为,即这个数组中的元素与函数的命名参数引用相同的值。
- 在严格模式下,delete操作符后面跟一个为限定的标识符,比如变量、函数、函数参数,会抛出错误syntaxError,非严格默认fasle
- 在严格模式下,删除一个不可配置的属性抛出错误TypeError,非严格模式下会失败 ,返回false
- 在严格模式下,对象字面量定义两个活多个同名的属性是语法错误,非严格不会发生错误
- 在严格模式下,不允许使用八进制整数字面量,非严格允许
- 在严格模式下,标识符eval和arguments被当做关键字,不允许修改他们的值。不能给这些标识符赋值,不能把它们声明为变量,不能把它们作为函数名或者函数参数名,也不能作为catch块的标识符使用
- 在严格模式下,检查调用栈的能力是受限的。arguments.caller和arguments.callee在严格模式下函数会抛出typeError。严格模式函数也有caller和arguments属性,单读取它们会抛出错误typeError