精华内容
下载资源
问答
  • js严格模式

    2021-03-17 09:42:19
  • Js严格模式

    千次阅读 2020-04-25 12:39:18
    Js严格模式 JavaScript严格模式strict mode,即在严格的条件下运行。严格模式消除了Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;消除代码运行的一些不安全之处,保证代码运行的安全;提高了引擎的...

    Js严格模式

    JavaScript严格模式strict mode,即在严格的条件下运行。严格模式消除了Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;消除代码运行的一些不安全之处,保证代码运行的安全;提高了引擎的效率,增加运行速度;为未来新的Js版本做好铺垫。

    实例

    针对整个脚本文件启用严格模式。

    "use strict";
    x = 1; // Uncaught ReferenceError: x is not defined
    

    针对函数作用域启用严格模式。

    x = 1;
    function s(){
        "use strict";
        y = 1; // Uncaught ReferenceError: y is not defined
    }
    s();
    

    严格模式的限制

    不允许直接声明全局变量

    // 非严格模式
    x = 1;
    console.log(window.x); // 1
    
    // 严格模式
    "use strict";
    var x = 1; // 可以使用var在全局作用域声明全局变量
    y = 1; // Uncaught ReferenceError: y is not defined
    

    不允许delete变量和函数

    // 非严格模式
    var x = 1;
    delete x; 
    console.log(window.x); // undefined
    
    // 严格模式
    "use strict";
    var x = 1;
    delete x; // Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
    

    要求函数的参数名唯一

    // 非严格模式
    function s(a, a){
        console.log(a + a); // 6
    }
    s(2, 3);
    
    // 严格模式
    "use strict";
    function s(a, a){ // Uncaught SyntaxError: Duplicate parameter name not allowed in this context
        console.log(a + a);
    }
    s(2, 3);
    

    不允许使用八进制数字语法

    // 非严格模式
    var x = 010;
    console.log(x); // 8
    
    // 严格模式
    "use strict";
    var y = 010; // Uncaught SyntaxError: Octal literals are not allowed in strict mode.
    var x = 0O10; // 可以使用ES6中的八进制表示法新写法 前缀0o或0O
    console.log(x); // 8
    

    不允许使用转义字符

    // 非严格模式
    var x = "\045";
    console.log(x); // %
    
    // 严格模式
    "use strict";
    var x = "\045"; // Uncaught SyntaxError: Octal escape sequences are not allowed in strict mode.
    

    不允许对只读属性操作

    // 非严格模式
    // 操作静默失败,即不报错也没有任何效果
    
    // 给不可写属性赋值
    var obj = {};
    Object.defineProperty(obj, "x", {value:0, writable:false});
    obj.x = 1;
    console.log(obj.x); // 0
    
    // 给只读属性赋值
    var obj = { 
        _x: 0,
        get x() { return this._x; } 
    };
    obj.x = 1;
    console.log(obj.x); // 0
    
    // 给不可扩展对象的新属性赋值
    var obj = {};
    Object.preventExtensions(obj);
    obj.x = 1;
    console.log(obj.x); // undefined
    
    // 严格模式
    // 操作失败抛出异常
    "use strict";
    
    // 给不可写属性赋值
    var obj = {};
    Object.defineProperty(obj, "x", {value:0, writable:false});
    obj.x = 1; // Uncaught TypeError: Cannot assign to read only property 'x' of object '#<Object>'
    
    // 给只读属性赋值
    var obj = { 
        _x: 0,
        get x() { return this._x; } 
    };
    obj.x = 1; // Uncaught TypeError: Cannot set property x of #<Object> which has only a getter
    
    // 给不可扩展对象的新属性赋值
    var obj = {};
    Object.preventExtensions(obj);
    obj.x = 1; // Uncaught TypeError: Cannot add property x, object is not extensible
    

    不允许使用保留关键字命名变量

    // 非严格模式
    var eval = 1;
    console.log(eval); // 1
    
    // 严格模式
    "use strict";
    var eval = 1; // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
    

    不允许使用with关键字

    // 非严格模式
    var obj = { x:0 };
    with(obj) {
        x = 1;
    }
    
    // 严格模式
    "use strict";
    var obj = { x:0 };
    with(obj) { // Uncaught SyntaxError: Strict mode code may not include a with statement
        x = 1;
    }
    

    eval声明变量不能在外部使用

    // 非严格模式
    eval("var x = 0");
    console.log(x); // 0
    
    // 严格模式
    "use strict";
    eval("var x = 0"); // eval作用域
    console.log(x); // Uncaught ReferenceError: x is not defined
    

    arguments保留原始参数

    // 非严格模式
    function s(a, b){
        a = 2;
        console.log(arguments[0], arguments[1]); // 2 2
    }
    s(1, 2);
    
    // 严格模式
    "use strict";
    function s(a, b){
        a = 2;
        console.log(arguments[0], arguments[1]); // 1 2
    }
    s(1, 2);
    

    this的限制

    在严格模式下通过this传递给一个函数的值不会被强制转换为一个对象。对一个普通的函数来说,this总会是一个对象:不管调用时this它本来就是一个对象;还是用布尔值,字符串或者数字调用函数时函数里面被封装成对象的this;还是使用undefined或者null调用函数式this代表的全局对象(使用call,apply或者bind方法来指定一个确定的this)。这种自动转化为对象的过程不仅是一种性能上的损耗,同时在浏览器中暴露出全局对象也会成为安全隐患,因为全局对象提供了访问那些所谓安全的JavaScript环境必须限制的功能的途径。所以对于一个开启严格模式的函数,指定的this不再被封装为对象,而且如果没有指定this的话它值是undefined

    // 非严格模式
    function s(){
        console.log(this); // Window ...
    }
    s();
    
    // 严格模式
    "use strict";
    function s(){
        console.log(this); // undefined
    }
    s();
    

    禁止访问调用栈

    在严格模式中再也不能通过广泛实现的ECMAScript扩展游走于JavaScript的栈中。在普通模式下用这些扩展的话,当一个叫fun的函数正在被调用的时候,fun.caller是最后一个调用fun的函数,而且fun.arguments包含调用fun时用的形参。这两个扩展接口对于安全JavaScript而言都是有问题的,因为他们允许安全的代码访问专有函数和他们的(通常是没有经过保护的)形参。如果fun在严格模式下,那么fun.callerfun.arguments都是不可删除的属性而且在存值、取值时都会报错。

    // 非严格模式
    function ss(){
        console.log(ss.caller); // ƒ s(){ ss(); }
        console.log(ss.arguments); // Arguments [callee: ƒ, Symbol(Symbol.iterator): ƒ]
    }
    function s(){
        ss();
    }
    s();
    
    // 严格模式
    "use strict";
    function ss(){
        console.log(ss.caller); // Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
        console.log(ss.arguments); // Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them ƒ]
    }
    function s(){
        ss();
    }
    s();
    

    每日一题

    https://github.com/WindrunnerMax/EveryDay
    

    参考

    https://www.runoob.com/js/js-strict.html
    https://www.cnblogs.com/xumqfaith/p/7841338.html
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode
    
    展开全文
  • JS严格模式

    2021-02-06 16:37:54
    JS严格模式一.兼容性二.作用 一.兼容性 IE10才支持 二.作用 1.消除了语法的一些不合理的地方 2.提高了编译效率s 3.禁用了一些关键词,为以后做铺垫。 三、写法 <script> 'user strict' //下面写的代码就会按...

    一.兼容性

    IE10才支持

    二.作用

    1.消除了语法的一些不合理的地方
    2.提高了编译效率s
    3.禁用了一些关键词,为以后做铺垫。

    三、写法

    <script>
    'user strict'
    //下面写的代码就会按严格模式执行
    </script>
    //也可写在函数中
    (function(){
    'user strict';
    
    })()
    //也可为某个函数单独开启严格模式
    function fn(){
    'user strict';
    }
    
    
    

    IE10以下的会自动略掉这句话。不会有什么影响
    严格模式对变量的影响
    1.严格模式下,变量必须先声明,再使用。
    2.不能使用delete来删除定义好的变量。
    严格模式对this的影响
    1.以前的全局作用于函数下,this指向的是window
    ,在严格模式下,指向的是undefined
    2.同理以前的构造函数,直接调用时,,当普通函数调用,Array(),this指向的是window,不是new调用,会给window绑定上构造函数的属性,但在严格模式下,this指向不是window,是undefined了,会报错,但是new对象时,不会保存。
    3.定时器的this在严格模式下还是window
    4.事件和对象this还是指向调用者

    严格模式对函数的影响
    1.函数不能有重名参数,
    2.函数必须声明在顶层,es6会引入块级作用域,不允许在非函数的代码块中声明函数。即不能在语句中定义一个函数。

    展开全文
  • js 严格模式

    2019-09-01 17:34:33
    简单整理一下js严格模式下的变化。整理来源MDN 部分代码测试环境:Chrome 76.0.3809.132 将过失错误转成异常 严格模式下无法再意外创建全局变量。 "use strict"; mistypedVaraible = 17; // 这一行代码就会抛出 ...

    简单整理一下js严格模式下的变化。整理来源MDN

    部分代码测试环境:Chrome 76.0.3809.132

    将过失错误转成异常

    • 严格模式下无法再意外创建全局变量。
    "use strict";
    mistypedVaraible = 17; // 这一行代码就会抛出 ReferenceError。不可以不写声明
    
    • 严格模式下会使引起静默失败的赋值操作抛出异常。(包括但不限于,给不可写属性赋值,给只读属性赋值,给不可扩展对象的新属性赋值)
    • 试图删除不可删除属性时会抛出异常(之前这种操作不会产生任何效果)
    • Gecko在版本34之前,严格模式下一个对象内的属性重名会报错。现在已经修复,即在严格模式下可以重名。
    • 严格模式下要求函数的参数名唯一。
    • 严格模式下禁止使用八进制数字语法。
    • ECMAScript 6中的严格模式禁止对primitive(目前(第三阶段)新增加了bigInt基础类型)类型设置属性

    简化变量的使用

    • 禁用with
    • 严格模式下的 eval 不再为上层范围(surrounding scope,注:包围eval代码块的范围)引入新变量
      = 严格模式禁止删除变量声明。(注:依然可删除对象属性)

    让eval和arguments变的简单

    • 名称eval和arguments不能通过程序语法被绑定或赋值
    • 严格模式下,参数的值不会随着arguments对象的值的改变而改变。
    • 不再支持arguments.callee

    “安全的”Javascript

    • 在严格模式下通过this传递给一个函数的值不会被强制转换为一个对象
    • 在严格模式中再也不能通过广泛实现的ECMAScript扩展“游走于”JavaScript的栈中。如果fun在严格模式下,那么fun.caller和fun.arguments都是不可删除的属性而且在存值、取值时都会报错
    • 严格模式下的arguments不会再提供访问与调用这个函数相关的变量的途径。

    为未来的ECMAScript版本铺平道路

    • 在严格模式中一部分字符变成了保留的关键字。这些字符包括implements, interface, let, package, private, protected, public, static和yield。
    • 严格模式禁止了不在脚本或者函数层面上的函数声明


    浏览器的严格模式

    主流浏览器现在实现了严格模式。但是不要盲目的依赖它,因为市场上仍然有大量的浏览器版本只部分支持严格模式或者根本就不支持(比如IE10之前的版本)。严格模式改变了语义。依赖这些改变可能会导致没有实现严格模式的浏览器中出现问题或者错误。谨慎地使用严格模式,通过检测相关代码的功能保证严格模式不出问题。最后,记得在支持或者不支持严格模式的浏览器中测试你的代码。如果你只在不支持严格模式的浏览器中测试,那么在支持的浏览器中就很有可能出问题,反之亦然。

    展开全文
  • JS 严格模式

    2020-11-04 23:18:58
    ES5 的严格模式是采用具有限制性 JavaScript变体的一种方式,即在严格的条件下运行 JS 代码。 严格模式在 IE10 以上版本的浏览器中才会被支持,旧版本浏览器中会被忽略。 严格模式对正常的 JavaScript 语义做了一些...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,603
精华内容 1,041
关键字:

js严格模式