个性化阅读
专注于IT技术分析

“use strict”是什么?用JavaScript表示

本文概述

严格模式对解释器处理Javascript的方式进行了几处更改。严格模式通过将它们更改为引发错误来消除一些JavaScript静默错误。严格模式可修复导致JavaScript引擎难以执行优化的错误:有时可以使严格模式代码比非严格模式下的相同代码运行得更快, 并且禁止在将来的ECMAScript版本中定义某些语法(例如, 类等) 。

严格模式适用于整个脚本或单个功能。它不适用于{}中包含的语句块;尝试将其应用于此类上下文不会执行任何操作。基本上, strict的用途是在代码中引入更好的错误检查。

可以启用严格模式, 在脚本” use strict”的顶部添加具有以下内容的字符串;即:

在脚本标签或引用的文件上:

<script>
"use strict";
// Execute some script strictly
</script>

功能上(匿名或非匿名)

(function(){"use strict";
// All the code will be analyzed in strict mode
})();

function myAction(){
 "use strict";
// Threat me strictly

}

防止对象重复

以下对象具有2个具有相同名称的属性:

var myObject = {
  hello:"A string", anotherProperty:2, other:"Hi", hello:"A string"
};

如果没有严格模式, 则对象将具有属性, 但具有最新的声明值。在严格模式下, js解释器将抛出严格模式下不允许的对象常量中的Uncaught SyntaxError:Duplicate data属性。

禁止使用with陈述式

在严格模式下使用with语句:

"use strict";
var a, x, y;
var r = 10;

with (Math) {
 a = PI * r * r;
 x = r * cos(PI);
 y = r * sin(PI / 2);
}

将抛出Uncaught SyntaxError:严格模式代码可能不包含with语句。不建议使用with语句, 因为它可能导致令人困惑的错误和兼容性问题。

防止全局变量声明

不允许在范围内声明全局变量, 例如:

var history = [];

function ExecuteSomething(message){
    // Note that the code doesnt use => var toSaveInHistory, therefore there is an error
    toSaveInHistory = message;
    return console.log(message);
}

ExecuteSomething("My custom log");

先前的代码将引发Uncaught ReferenceError:未定义toSaveInHistory, 因为确实没有在闭包中声明toSaveInHistory。严格模式禁止隐式创建全局属性。

禁止将保留关键字用作变量名

使用将来的保留字作为标识符是无效的。标识符名称在严格模式下保留, 即:

  • 实施
  • 接口
  • private
  • protected
  • public
  • static

将参数作为标识符或修改Arguments变量

在严格模式下, 变量” arguments”(在所有函数中均被标识为数组, 该变量包含已发送给函数执行的所有参数, 请在此处详细了解参数变量的工作原理)不能用作标识符(变量或函数名, 参数名, 等等)也不会更改局部参数对象的成员的值, 即:

"use strict";
var arguments = "something";
// Throws => Invalid usage of 'arguments' in strict mode

// or
function executeSomething(age, name){
   arguments[0] = 12;
   return true;
}

executeSomething(15, "Batman");

在eval函数中声明的变量

如果在eval函数内部声明了变量, 则不能在该函数外部使用该变量, 即:

eval("var myVariable = 10;");
document.write(myVariable);

之前的代码抛出” myVariable”是未定义的。

禁止八进制语法

不允许将八进制值分配给数字文字, 或尝试对八进制值使用转义符, 即:

var myOctal = 012;
var myEscapedOctal = \012;

前面的代码抛出严格模式下不允许的八进制数字文字和转义字符。

扩展不可扩展的对象属性

如果没有严格模式, 则许多事情都会被静默忽略, 因为将属性添加到不可扩展的对象不会产生任何效果。但是, 如果启用了严格模式, 则会出现异常, 即:

var myItem = {};
Object.preventExtensions(myItem); 
myItem.otherProperty = 222;

前面的代码抛出”无法为不可扩展对象创建属性”。

支持的浏览器

当前所有主要浏览器(不包括IE 9和更低版本)都支持使用strict。有关更多信息, 请参阅我可以使用use strict。但是, 在Web上有很多地方, 他们会告诉你在ie8或9中使用严格模式不是问题, 如果你仍然怀疑的话, 请相信microsoft:

"use strict"是什么?用JavaScript表示1
赞(0)
未经允许不得转载:srcmini » “use strict”是什么?用JavaScript表示

评论 抢沙发

评论前必须登录!