gpt4 book ai didi

javascript - 可以移除严格模式而没有副作用吗

转载 作者:行者123 更新时间:2023-11-29 10:45:49 24 4
gpt4 key购买 nike

我有一个 JavaScript 应用程序,我想知道是否通过删除所有“use strict;”程序中的语句,我会以某种方式改变它的行为。
据我所知,严格模式不允许某些东西,一旦应用程序完成开发,我可以将其删除而不会造成任何副作用。
还有提到的'this'变量的情况here但 Chrome 直到现在似乎还没有实现这种行为。
谢谢!

最佳答案

在某些情况下,您的代码可能会受到影响,尽管其中大多数是人为设计的:

  • 当传递 nullundefined 作为 this 值时(在非严格模式下,this 被转换为全局对象,不是空对象):

    'use strict';
    (function () {
    if (!this) console.log('performs proper actions');
    else console.log('fail! oops...');
    }).call(undefined); // 'performs proper actions'

    在严格模式下,这将记录“执行正确的操作”。但是,这在非严格模式下并不相同,您会收到失败消息:

    (function () {
    if (!this) console.log('performs proper actions');
    else console.log('fail! oops...');
    }).call(undefined); // 'fail! oops...'

    如果您使用 null 而不是 undefined,它也会有相同的行为。

  • 如果您的函数依赖于未被强制转换为对象的 this 值——在非严格模式下,this 被隐式转换为对象。例如,false'Hello World!'NaNInfinity1 将被强制转换为其等效的对象包装器(如前所述,nullundefined 有它们自己的行为)。比较严格模式下发生的情况:

    'use strict';
    (function () { console.log(this); }).call(1); // 1

    ...在非严格模式下发生的事情:

    (function () { console.log(this); }).call(1); // '[object Number]'
  • 当依赖形式参数和 arguments 对象不在分配时共享它们的值时:

    function strict(a, b, c) {
    'use strict';
    var a = 1;
    var b = 2;
    var c = 3;
    var d = 4;
    console.log('strict: ' + (arguments[0] === a ? 'same' : 'different')); // different
    console.log('strict: ' + (arguments[1] === b ? 'same' : 'different')); // different
    console.log('strict: ' + (arguments[2] === c ? 'same' : 'different')); // different
    console.log('strict: ' + (arguments[3] === d ? 'same' : 'different')); // of course they're different; by design
    }

    function notStrict(a, b, c) {
    var a = 1;
    var b = 2;
    var c = 3;
    var d = 4;
    console.log('non-strict: ' + (arguments[0] === a ? 'same' : 'different')); // same
    console.log('non-strict: ' + (arguments[1] === b ? 'same' : 'different')); // same
    console.log('non-strict: ' + (arguments[2] === c ? 'same' : 'different')); // same
    console.log('non-strict: ' + (arguments[3] === d ? 'same' : 'different')); // of course they're different; by design
    }

    strict(0, 1, 2, 3);
    notStrict(0, 1, 2, 3);

    得到的结果如下:

    strict: different
    strict: different
    strict: different
    strict: different
    non-strict: same
    non-strict: same
    non-strict: same
    non-strict: different
  • 如果您一直在使用eval 并直接调用它,您会发现在eval 调用内部声明的变量和函数被泄露到周围范围,而不是在严格模式下处于自己的范围内。例如,a 在严格模式下保留其原始值:

    'use strict';
    var a = 42;
    eval('var a = -Infinity;');
    console.log(a); // 42

    ...在非严格模式下,它被分配了一个新值:

    var a = 42;
    eval('var a = -Infinity;');
    console.log(a); // -Infinity

    如果您依赖于正在创建的新范围,这将是对您的代码的重大更改。

  • 如果您故意使用在尝试分配给尚 undefined variable 时抛出 ReferenceError 的方式,这将影响您的代码运行方式:

    try {
    randomVariableThatHasntBeenDefined = 1;
    } catch (e) {
    alert('performs logic');
    }

    警报不会在非严格模式下显示。

所有这些都可以在 Annex C 中找到的 ECMAScript 5.1 Specification ,这是每个案例中发生的事情的权威引用。虽然这不是很容易阅读,但它对于理解特定的极端情况以及它们为何如此行事可能很有用。

关于javascript - 可以移除严格模式而没有副作用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19750229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com