Javascript “什么是”呢;“严格模式”;它是如何使用的?

Javascript “什么是”呢;“严格模式”;它是如何使用的?,javascript,strict-mode,Javascript,Strict Mode,我一直在查看上的JavaScript引用,发现了一个名为“严格模式”。我仔细看了一遍,我很难理解它的作用。有人能简要解释一下它的用途和用途吗?它的主要目的是做更多的检查 只需添加“使用严格”在代码顶部,在其他任何操作之前 例如,blah=33是有效的JavaScript。这意味着您创建了一个完全全局的变量blah 但在严格模式下,这是一个错误,因为您没有使用关键字“var”来声明变量 大多数时候你并不打算在任意范围的中间创建全局变量,所以大多数时候写代码< > BLAH=33/代码>这是一个错误

我一直在查看上的JavaScript引用,发现了一个名为
“严格模式”
。我仔细看了一遍,我很难理解它的作用。有人能简要解释一下它的用途和用途吗?

它的主要目的是做更多的检查

只需添加
“使用严格”在代码顶部,在其他任何操作之前

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

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

大多数时候你并不打算在任意范围的中间创建全局变量,所以大多数时候写代码< > BLAH=33/代码>这是一个错误,程序员实际上并不希望它是一个全局变量,他们打算写<代码> var BLAH=33 < /代码> .< 它同样禁止许多技术上有效的事情去做

NaN=“lol”
不会产生错误。它也不会改变NaN的值。使用严格的this(和类似的奇怪语句)会产生错误。大多数人喜欢这样,因为没有理由写
NaN=“lol”
,所以很可能是打字错误


.

添加了严格模式,以便有一个易于静态分析的子集,这将是该语言未来版本的一个良好目标。Strict模式的设计也希望将自己限制在Strict模式下的开发人员会犯更少的错误,并且他们所犯的错误会以更明显的方式表现出来

,它有望成为ECMAScript的下一个主要版本,并将在ES5的基础上构建

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

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

SES(安全ECMAScript)设计实验

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

从SES到ES5/Strict应该有一个直接的翻译

本标准的第1部分解释了严格模式和正常模式之间的区别

严格模式限制与例外

  • 标识符“implements”、“interface”、“let”、“package”、“private”、“protected”、“public”、“static”和“yield”在严格模式代码中被分类为FutureReservedWord令牌。(7.6.12[?])
  • 在处理严格模式代码时,一致性实现可能不会扩展NumericLiteral(7.8.3)的语法,以包括B.1.1中所述的八进制数
  • 当处理严格模式代码(见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或参数不能显示为赋值运算符(11.13)或后置表达式(11.3)的LeftHandside表达式,也不能显示为前缀递增运算符(11.4.4)或前缀递减运算符(11.4.5)操作的一元表达式。 严格模式函数的Arguments对象定义名为“caller”和“callee”的不可配置访问器属性,这些属性在访问时抛出TypeError异常(10.6)
  • 严格模式函数的参数对象不会动态地与其函数的相应形式参数绑定共享其数组索引属性值。(10.6). 对于严格模式函数,如果创建了arguments对象,则本地标识符参数与arguments对象的绑定是不可变的,因此可能不是赋值表达式的目标。(10.5)
  • 如果严格模式代码包含一个ObjectLiteral,并且任何数据属性的定义不止一个(11.1.5),则这是一个语法错误。 如果标识符“eval”或标识符“arguments”作为包含在严格代码中的PropertyAsignment的PropertySetParameterList中的标识符出现,或者如果其函数体是严格代码(11.1.5),则为语法错误
  • 严格模式eval代码无法在eval调用方的变量环境中实例化变量或函数。相反,将创建一个新的变量环境,并将该环境用于eval代码的声明绑定实例化(10.4.2)
  • 如果在严格模式代码中对此进行求值,则不会将此值强制为对象。A此值为null或undefined不会转换为全局对象,并且原语值不会转换为包装器对象。通过函数调用传递的此值(包括使用function.prototype.apply和function.prototype.call进行的调用)不会强制将传递的此值传递给对象(10.4.3、11.1.1、15.3.4.3、15.3.4.4)
  • 当delete运算符出现在严格模式代码中时,如果其UnaryExpression是对变量、函数参数或函数名的直接引用,则会抛出SyntaxError(11.4.1)
  • 当删除运算符出现在严格模式代码中时,如果要删除的属性具有属性{[[Configurable]]:false}(11.4.1),则会引发TypeError。 如果VariableDeclaration或VariableDeclarationNoIn出现在严格的代码中,并且
    function Obj() {
       this.a = 12;
       this.b = "a";
       this.privilegedMethod = function () {
          this.a++;
          privateMethod();
       };
    
       function privateMethod() {
         this.b = "foo";
       }
    }
    
    "use strict";
    
    // app.js whole script in strict mode syntax
    “use strict”;
    // Now you can start writing your code
    
    function yourFunc(){
        "use strict";
    
        // Your function code logic
    }
    
    (function(){
        x = 3;
    })();
    
    // Will not throw an error
    
    .fatty{
      width: percentage(6/7);
    }
    
    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...
    
    sudo npm install -g n
    sudo n stable
    
    npm rebuild node-sass --force