需要澄清在严格模式下JavaScript代码的行为

3
在关于 JavaScript 严格模式的 MDN 文档 中,“语义差异 -> 函数调用中的 this”部分提到:

当使用 callapply 调用函数时,如果该值为基础类型,则此值将被装箱为对象(对于未定义和 null 的情况则为全局对象)。在严格模式下,该值会直接传递而不进行转换或替换。

我需要澄清这个声明。但是当我测试时,我没有看到代码模式(严格模式或非严格模式)有任何区别。
以下是我的测试方式:

(function() {
  function a() {
    console.log(this);
  }

  function b() {
    "use strict";
    a.call(2);
  }

  function c() {
    a.call(3);
  }

  b();
  c();
})();

结果:

在这里输入图像描述


2
如果你把"use strict";放在顶层、IIFE的开头或者a()中,它会按预期工作。但是如果你把它放在b()c()中就不行了。不确定为什么。 - Barmar
1个回答

5
被描述的行为取决于被调用的函数是否处于严格模式,而不是调用者。

(function() {
  function strict() {
    "use strict";
    console.log(this);
  }

  function sloppy() {
    console.log(this);
  }

  function b() {
    strict.call(2);
  }

  function c() {
    sloppy.call(3);
  }

  b();
  c();
})();

通常你会将整个脚本置于严格模式下,这样调用者和被调用者之间的区别就不重要了。


谢谢你的回答。我想我误解了这个陈述。现在我明白了。 - Parakrama Dharmapala
1
MDN上的措辞有些含糊不清。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接