javascript进阶学习:use strict严格模式和非严格模式的区别
"use strict"是ECMAScript 5引入的一个指令,目的是说明后续代码将会解析为严格代码。
"use strict" 只能出现在脚本代码的开始或函数体的开始,但是并不一定是首行,首行有其他 字符串或者注释语句并不影响
严格模式和非严格模式的区别如下,前三条尤为重要
严格模式禁止使用with语句
以下代码会抛出错误:Uncaught SyntaxError: Strict mode code may not include a with statement
"use strict" var obj={ a:1, b:2 } with (obj) { console.log(a) }
严格模式中,所有的变量都要先声明才能使用,而非严格模式,这种隐式声明的全局变量的方法是给全局对象新添加一个属性
//非严格模式可以正常运行 c=5 console.log(c) //严格模式抛出错误 "use strict" c=5 console.log(c) //Uncaught ReferenceError: c is not defined
在严格模式中,调用的函数中的一个this值是undefined(非严格模式中,调用的函数中的this值总是全局对象)
//非严格模式 function test(){ console.log(this) } test() //Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …} //严格模式 "use strict" function test(){ console.log(this) } test() //undefined
利用上面的特性,我们可以判断当前是不是严格模式
var hasStrictMode=(function () { return this===undefined }()) console.log(hasStrictMode)
当通过call()或者apply()来调用函数时,其中的this值就是通过call()或者apply()传入的第一个参数
在严格模式中,给只读属性赋值和给不可扩展的对象创建新成员都将抛出一个类型错误异常;非严格模式中,这些操作只是简单地操作失败,不会报错
在严格模式中,传入eval()的代码不能在调用程序所在的上下文中声明变量或定义函数,而在非严格模式中可以
//非严格模式 eval("var x=1") console.log(x) //1 //严格模式 "use strict" eval("var x=1") console.log(x) //Uncaught ReferenceError: x is not defined
在严格模式中,函数里的arguments对象拥有传入函数值的静态副本;非严格模式中,arguments对象具有“魔术般”的行为,arguments里的数组元素和函数参数都是指向同一个值的引用
//非严格模式 function test(x) { arguments[0]=null console.log(x) //输入null,因为x和arguments[0]指向同一个引用地址 } test(1) //严格模式 "use strict" function test(x) { arguments[0]=null console.log(x) //输出1 } test(1)
严格模式中,当delete运算符后跟随非法的标识符时,将会抛出一个错误;非严格模式中,这种delete表达式什么也没做,并返回false
在严格模式中,在一个对象直接量中定义两个或多个同名的参数,将产生一个语法错误
在严格模式中,函数声明中存在两个或多个同名的参数将产生一个语法错误
在严格模式中是不允许使用八进制整数直接量(以0为前缀,而不是0x为前缀)的
在严格模式中,标识符eval和arguments当做关键字,他们的值是不能更改的
在严格模式中,限制了对调用栈的检测能力,在严格模式的函数中,arguments.caller 和 arguments.callee都会抛出一个类型错误异常
点赞(0)