资讯专栏INFORMATION COLUMN

JS严格模式

Harriet666 / 2178人阅读

摘要:整理一下严格模式中不同于一般模式的地方。以上代码在非严格模式中显示结果为,只能访问最后一个同名参数。非严格模式严格模式不允许使用中声明的的变量或方法作用域仅限内部,不再会被创建到其所在的上下文中。在严格模式下始终指向指定的值,包括和。

整理一下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 them

eval

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

相关文章

  • 谈谈 JS 中的严格模式

    摘要:什么是严格模式严格模式是中引入的一种将更好的错误检查引入代码中的方法现在已经被大多浏览器实现顾名思义,这种模式使得在更严格的条件下运行因此在严格模式下我们的一些不严谨的写法将会导致程序抛出错误例如在严格模式下该行将会抛出错误在上面的代码中由 什么是严格模式? 严格模式 是 ECMAScript 5 中引入的一种将更好的错误检查引入代码中的方法, 现在已经被大多浏览器实现. 顾名思义,这...

    Meils 评论0 收藏0
  • javascript严格模式

    摘要:概述的严格模式是中的一种限制性更强的变种方式。严格模式在语义上与正常的有一些不同。首先,严格模式会将陷阱直接变成明显的错误。严格模式禁止删除声明变量。 概述 ECMAScript 5的严格模式是JavaScript中的一种限制性更强的变种方式。严格模式不是一个子集:它在语义上与正常代码有着明显的差异。不支持严格模式的浏览器与支持严格模式的浏览器行为上也不一样, 所以不要在未经严格模式特...

    Chao 评论0 收藏0
  • js严格模式下的总结

    摘要:也可以只在函数中打开严格模式严格模式下没有全局变量严格模式下会报错,非严格模式下正常删除变量有三种声明的情形声明的全局变量声明的局部变量中声明的全局变量第一种和第二种情况是无法用删掉的。 所谓严格模式其实就是一个不会赋值给任何变量的字符串 use strict如果在全局作用域下 给出这个提示,那整个脚本将采用严格模式。也可以只在函数中打开严格模式 1.严格模式下没有全局变量 a=tes...

    liaorio 评论0 收藏0
  • JS专题之严格模式

    摘要:整个脚本文件就会以严格模式执行。函数作用域范围将放在函数体的第一行,则整个函数以严格模式运行。严格模式下,必须指明的指向对象。禁止在非函数代码块声明函数的严格模式只允许在全局作用域或函数作用域声明函数。 ECMAScript 5 引入了 strict mode ,现在已经被大多浏览器实现(从IE10开始) 一、什么是严格模式 顾名思义,JavaScript 严格模式就是让 JS 代码以...

    baukh789 评论0 收藏0
  • 严格模式

    摘要:严格模式创设了第三种作用域作用域。正常模式下,指向全局对象,如果绑定的值是非对象,将被自动转为对象再绑定上去,而和这两个无法转成对象的值,将被忽略严格模式 概述 严格模式是ES5进入标准的目的是为了: 明确禁止一些不合理 不严谨的语法 减少JS语言的一些怪异行为 增加更多报错的场合 保证代码运行的安全 提高编译效率 增加运行速度 为新版的JS语法做铺垫 如何开启 使用一段字符串...

    Yi_Zhi_Yu 评论0 收藏0

发表评论

0条评论

Harriet666

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<