摘要:整理一下严格模式中不同于一般模式的地方。以上代码在非严格模式中显示结果为,只能访问最后一个同名参数。非严格模式严格模式不允许使用中声明的的变量或方法作用域仅限内部,不再会被创建到其所在的上下文中。在严格模式下始终指向指定的值,包括和。
整理一下JS严格模式中不同于一般模式的地方。
启用严格模式有两种方式启用严格模式
js文件第一行代码为"use strict";
方法内第一行代码为"use strict";
第一种方式对整个js文件中所有代码启用严格模式;
第二种方式对单个方法中所有代码启用严格模式;
每一段内嵌js代码视同单个js文件。如下面代码中第一段script内嵌js中启用了严格模式,但不会影响其他script内嵌js:
注:之前看阮一峰老师的一篇关于严格模式的文章里说“只要前面不是产生实际运行结果的语句,use strict;可以不在第一行,比如直接跟在一个空的分号后面。”然而在chrome和node v4.5.0版本中测试结果use strict之前有任何代码(包括一个空的分号),都不会启用严格模式,也就是说use strict必须放在最起始位置。可能是写这篇文章的时候js引擎和现在有差别的原因吧。
语法限制 变量不允许意外创建全局变量。声明一个新变量时,变量名前必须有var/let/const。
不允许对变量执行delete操作。
object
不允许修改只读属性。
"use strict"; var fn = {}; Object.defineProperty(fn, "c", {writable : false}); fn.c = 2; //TypeError: Cannot assign to read only property "c" of object "#"
不允许对不可配置的属性执行delete操作。
var fn = {}; Object.defineProperty(fn, "c", {configurable : false}); delete fn.c; //TypeError: Cannot delete property "c" of #
不允许为不可扩展对象添加属性或方法。
"use strict"; var fn ={a:1}; Object.preventExtensions(fn); fn.b =2; //TypeError: Can"t add property b, object is not extensible
不允许为密封对象添加属性或方法,且不允许对密封对象的属性执行delete操作。
"use strict"; var fn ={a:1}; Object.seal(fn); delete fn.a; //TypeError: Cannot delete property "a" of #
不允许为冻结对象添加属性或方法,且不允许对冻结对象的属性执行delete操作,且不允许修改冻结对象的属性。
"use strict"; var fn ={a:1}; Object.freeze(fn); fn.a = 2; //TypeError: Cannot assign to read only property "a" of object "#"function
方法不允许有多个命名相同的形参。
"use strict"; function fn(a, a){console.log(a);} fn(2,3); //SyntaxError: Duplicate parameter name not allowed in this context /*以上代码在非严格模式中显示结果为3,只能访问最后一个同名参数。*/
形参与arguments完全独立。
"use strict"; function showValue(value){ value = "Foo"; console.log(value); //"Foo" console.log(arguments[0]); //非严格模式:"Foo";严格模式:"Hi" }showValue("Hi");
不允许使用arguments.callee
"use strict"; (function showValue(value){ console.log(arguments.callee); })();//TypeError: "caller", "callee", and "arguments" properties may not be accessed on strict mode functions or the arguments objects for calls to themeval
eval中声明的的变量或方法作用域仅限eval内部,不再会被创建到其所在的上下文中。
"use strict"; (function doSomething(){ var y = eval("var x=10;x*2"); console.log(y); //20 console.log(x); //ReferenceError: x is not defined })();this
this在严格模式下始终指向指定的值,包括null和undefined。
window.color="red"; //node环境中为global.color = "red"; function displayColor(){ console.log(this.color); } displayColor.call(null);
以上代码在非严格模式中,this会默认指向全局变量;但是在严格模式中,this指向null,因此调用this.color时会报错。
其他不允许使用with语句。
不允许使用八进制字面量。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/80114.html
摘要:什么是严格模式严格模式是中引入的一种将更好的错误检查引入代码中的方法现在已经被大多浏览器实现顾名思义,这种模式使得在更严格的条件下运行因此在严格模式下我们的一些不严谨的写法将会导致程序抛出错误例如在严格模式下该行将会抛出错误在上面的代码中由 什么是严格模式? 严格模式 是 ECMAScript 5 中引入的一种将更好的错误检查引入代码中的方法, 现在已经被大多浏览器实现. 顾名思义,这...
摘要:概述的严格模式是中的一种限制性更强的变种方式。严格模式在语义上与正常的有一些不同。首先,严格模式会将陷阱直接变成明显的错误。严格模式禁止删除声明变量。 概述 ECMAScript 5的严格模式是JavaScript中的一种限制性更强的变种方式。严格模式不是一个子集:它在语义上与正常代码有着明显的差异。不支持严格模式的浏览器与支持严格模式的浏览器行为上也不一样, 所以不要在未经严格模式特...
摘要:也可以只在函数中打开严格模式严格模式下没有全局变量严格模式下会报错,非严格模式下正常删除变量有三种声明的情形声明的全局变量声明的局部变量中声明的全局变量第一种和第二种情况是无法用删掉的。 所谓严格模式其实就是一个不会赋值给任何变量的字符串 use strict如果在全局作用域下 给出这个提示,那整个脚本将采用严格模式。也可以只在函数中打开严格模式 1.严格模式下没有全局变量 a=tes...
阅读 1745·2023-04-26 00:20
阅读 1762·2021-11-08 13:21
阅读 1906·2021-09-10 10:51
阅读 1523·2021-09-10 10:50
阅读 3226·2019-08-30 15:54
阅读 2114·2019-08-30 14:22
阅读 1408·2019-08-29 16:10
阅读 3070·2019-08-26 11:50