什么是“严格模式”以及如何使用?


Answers:


149

其主要目的是进行更多检查。

只需"use strict";在代码顶部添加即可。

例如,blah = 33;有效的JavaScript。这意味着您将创建一个完全全局变量blah

但是在严格模式下,这是一个错误,因为您没有使用关键字“ var”来声明变量。

在大多数情况下,您并不是要在某个任意范围的中间创建全局变量,因此在大多数情况下,blah = 33编写它是一个错误,并且程序员实际上并不希望将其作为全局变量,这意味着写var blah = 33

同样,它不允许做很多在技术上有效的事情。NaN = "lol"不会产生错误。它也不会改变NaN的值。使用严格的this(和类似的怪异语句)会产生错误。大多数人对此表示赞赏,因为没有理由要写东西NaN = "lol",因此很可能是打字错误。

在严格模式下的MDN页面上阅读更多内容


4
这是该文档在MDN上的精确副本
nkcmr,2011年

23
那你对它的效用不了解吗?它旨在通过捕获有效但最有可能发生的错误来帮助开发。
西蒙·萨里斯

34

Simon的答案中未提到的严格模式的一个方面是,严格模式设置thisundefined通过函数调用调用的函数。

所以这样的事情

function Obj() {
   this.a = 12;
   this.b = "a";
   this.privilegedMethod = function () {
      this.a++;
      privateMethod();
   };

   function privateMethod() {
     this.b = "foo";
   }
}

会在privateMethod调用时引起错误(因为您无法向中添加属性undefined),而不是无用地向b全局对象添加属性。


4
是的,需要添加privateMethod.bind(this)();并致电new jsbin.com
hlcs,2016年


21

添加了严格模式,以便可以轻松地静态分析EcmaScript的子集,这将是该语言未来版本的良好目标。还设计了严格模式,以希望将自己限制在严格模式下的开发人员可以减少错误,并使他们所犯的错误以更明显的方式表现出来。

Harmony有望成为EcmaScript的下一个主要版本,它将建立在严格的ES5之上。

和谐建立在ES5严格模式的基础上,以避免过多的模式。

其他一些语言实验也取决于严格模式。 SES取决于ES5严格模式的可分析性。

SES(安全ECMAScript)设计实验

通过删除或修复ES5 / Strict中的功能来设计对象能力编程语言。

从SES到ES5 / Strict应该有直接的转换。

该标准的附录C解释了严格模式和普通模式之间的区别。

严格模式限制和例外

  • 在严格模式代码中,标识符“实现”,“接口”,“ let”,“包”,“私有”,“受保护”,“公共”,“静态”和“收益”被分类为FutureReservedWord令牌。(7.6.12 [?])。
  • 符合标准的实现在处理严格模式代码时,可能不会将NumericLiteral(7.8.3)的语法扩展为包括B.1.1中所述的OctalIntegerLiteral。
  • 符合标准的实现在处理严格模式代码(请参见10.1.1)时,不得将EscapeSequence的语法扩展为包括B.1.2中所述的OctalEscapeSequence。
  • 分配给未声明的标识符或其他无法解析的引用不会在全局对象中创建属性。在严格模式代码内进行简单分配时,其LeftHandSide不得求值为无法解析的引用。如果这样做,则会引发ReferenceError异常(8.7.2)。LeftHandSide也可能不是对属性值为{[[Writable]]:false}的数据属性,对属性值为{[[Set]]:undefined}的访问器属性的引用,也不是对不存在的引用对象的[[Extensible]]内部属性的值为false。在这些情况下,将引发TypeError异常(11.13.1)。
  • 标识符eval或参数不能显示为Assignment运算符(11.13)或PostfixExpression(11.3)的LeftHandSideExpression或由Prefix Increment(11.4.4)或Prefix Decrement(11.4.5)运算符操作的UnaryExpression。 。严格模式功能的参数对象定义了名为“ caller”和“ callee”的不可配置的访问器属性,它们在访问时引发TypeError异常(10.6)。
  • 严格模式函数的参数对象不会与函数的相应形式参数绑定动态共享其数组索引属性值。(10.6)。对于严格模式功能,如果创建了参数对象,则本地标识符参数到参数对象的绑定是不可变的,因此可能不是赋值表达式的目标。(10.5)。
  • 如果严格模式代码包含一个ObjectLiteral且任何数据属性的定义不止一个(11.1.5),则为SyntaxError。如果标识符“ eval”或标识符“ arguments”作为包含在严格代码中的PropertyAssignment的PropertySetParameterList中的标识符出现,或者其FunctionBody为严格代码(11.1.5),则为SyntaxError。
  • 严格模式评估代码无法在调用者的变量环境中实例化变量或函数来评估。而是创建一个新的变量环境,并将该环境用于评估代码的声明绑定实例化(10.4.2)。
  • 如果这是在严格模式代码中评估的,则此值不会强制到对象。此null或undefined的this值不会转换为全局对象,并且原始值也不会转换为包装器对象。通过函数调用传递的this值(包括使用Function.prototype.apply和Function.prototype.call进行的调用)不会强制将传递的该值传递给对象(10.4.3、11.1.1、15.3.4.3、15.3)。 4.4)。
  • 如果在严格模式代码中发生删除运算符,则如果其UnaryExpression是对变量,函数参数或函数名称的直接引用(11.4.1),则抛出SyntaxError。
  • 在严格模式代码内发生删除运算符时,如果要删除的属性具有属性{[[[Configurable]]:false}(11.4.1),则会引发TypeError。如果在严格代码内发生VariableDeclaration或VariableDeclarationNoIn且其标识符为eval或参数(12.2.1),则为SyntaxError。
  • 严格模式代码可能不包含WithStatement。在这样的上下文中WithStatement的出现是SyntaxError(12.10)。
  • 如果在严格的代码内发生了带有Catch的TryStatement,并且Catch产生的标识符为eval或自变量(12.14.1),则为SyntaxError。
  • 如果标识符eval或参数出现在严格模式FunctionDeclaration或FunctionExpression(13.1)的FormalParameterList中,则为SyntaxError。
  • 严格模式功能可能没有两个或多个具有相同名称的形式参数。使用FunctionDeclaration,FunctionExpression或Function构造函数创建此类函数的尝试是SyntaxError(13.1,15.3.2)。
  • 除了本规范中定义的实现之外,实现也不能扩展名为调用方的属性的严格模式功能或函数实例的参数的含义。ECMAScript代码不得在与严格模式功能(10.6、13.2、15.3.4.5.3)相对应的功能对象上使用这些名称创建或修改属性。
  • 在严格模式代码中使用标识符eval或参数作为FunctionDeclaration或FunctionExpression的标识符或形式参数名称(13.1),这是SyntaxError。尝试使用Function构造函数(15.3.2)动态定义这种严格模式的函数将引发SyntaxError异常。

6

ECMAScript 5引入了严格模式的概念。

在代码中调用严格模式

严格模式适用于整个脚本或单个功能。它不适用于用{}大括号括起来的block语句,尝试将其应用于此类上下文没有任何作用。

整个脚本:

假设我们正在创建app.js,因此添加first语句use脚本将对整个代码强制采用严格模式。

// app.js whole script in strict mode syntax
use strict”;
// Now you can start writing your code 

功能严格模式:

要为函数调用严格模式,请输入确切的语句“ use strict”;在函数主体的开头,然后再执行其他任何语句。

function yourFunc(){
 "use strict";

 // Your function code logic
}

严格模式对常规Javascript语义进行了一些更改。第一种严格模式通过将它们更改为引发错误来消除一些JavaScript静默错误。

例如:使用严格模式的代码

在此处输入图片说明

在上面的代码示例中,未在代码中使用严格模式。不会引发错误。由于我们在x未声明的情况下访问变量。因此,在严格模式下,访问未声明的变量将引发错误。

现在,让我们尝试访问变量x而不用严格模式声明它。

(function(){
    x = 3;
})();

// Will not throw an error

使用严格模式的优势:

  • 通过抛出错误来消除JavaScript静默错误。
  • 修复了使JavaScript引擎难以优化的错误。
  • 使代码比非严格模式下的相同代码更快地运行
  • 禁止在将来的ECMAScript版本中定义某些语法。

5

严格模式对常规JavaScript语义进行了几处更改。

  • 严格模式通过将它们更改为引发错误来消除一些JavaScript静默错误。

  • 严格模式可修复导致JavaScript引擎难以执行优化的错误。

  • 严格模式禁止在将来的ECMAScript版本中定义某些语法。


1

ECMAScript5引入了一些新的对象和属性,也称为"strict mode"

严格模式是该语言的子集,不包括已弃用的功能。严格模式是选择加入的,而不是必需的,这意味着,如果希望代码在严格模式下运行,则可以使用以下字符串(每个函数一次,或者整个程序一次)声明意图。

"use strict";

1

2017年,我终于找到了文档:https :
//developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

严格模式是选择加入JavaScript的受限变体的一种方式。严格模式不仅仅是一个子集:它有意地具有与普通代码不同的语义。不支持严格模式的浏览器将运行具有与严格浏览器不同行为的严格模式代码,因此在没有进行功能测试以支持严格模式相关方面的情况下,请不要依赖严格模式。严格模式代码和非严格模式代码可以共存,因此脚本可以逐步进入严格模式。


严格模式对常规JavaScript语义进行了几处更改。首先,严格模式通过将它们更改为抛出错误来消除一些JavaScript静默错误。其次,严格模式修复了一些错误,这些错误使JavaScript引擎难以执行优化:有时,严格模式代码的运行速度可能比非严格模式的相同代码快。第三,严格模式禁止在将来的ECMAScript版本中定义某些语法。


0

问题:
以下是我遇到的问题,我在遵循一个教程,结果最终试图编译以下scss文件并尝试从中生成CSS代码,

.fatty{
  width: percentage(6/7);
}

使用以下gulpfile.js任务:

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    return gulp.src('app/scss/styles.scss')
        .pipe(sass())
        .pipe(gulp.dest('app/css'))
});

所以我得到的错误如下:

~/htdocs/Learning/gulp1/node_modules/gulp-sass/index.js:66
    let sassMap;
    ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
// stacktrace here...

解决方案:
因此它向我显示了index.js在gulp-sass模块内部的文件(该文件基本上是锁定的,不应进行编辑)。但是,如果我强行执行并将其添加到"use_strict"index.js文件的顶部,它将顺利地执行我的任务。

我很无助,所以我一直使用它作为解决方案!但是在经过其他一些SO Q&A之后,我看到以下答案

sudo npm install -g n
sudo n stable

并很快将我的NodeJs更新到了Version10.x,然后按照Terminal的指示运行以下命令来重新构建Gulp:

npm rebuild node-sass --force

一切都还好。这样便解决了。我撤消了对index.jsgulp模块文件所做的更改。现在,它运行平稳。

希望这个答案对那里的人有帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.