"use strict" 不适用于使用 Visual Studio 代码的 ES6

"use strict" does not work on ES6 using Visual Studio Code

"use strict"模式下,函数中的this应该是[object Window]而不是普通模式下调用函数的对象。但是当我试图证明概念时,它不起作用,我想知道 Visual Studio 代码中的 ES6 扩展有问题,但我不知道如何解决。有人能帮我吗? :| 这是我用来测试的代码 "use strict":

function name1() {
   document.querySelectorAll("p")[0].innerHTML += this;
}
function name2() {
   "use strict";
   document.querySelectorAll("p")[0].innerHTML += this;
}
document.querySelectorAll("button")[0].addEventListener("click", name1);
document.querySelectorAll("button")[1].addEventListener("click", name2);

关于 this,严格模式意味着调用 没有 任何调用上下文的函数 - 不在对象上的未绑定函数 - 将收到 this undefined 而不是全局对象。

例如,您可以通过以下函数看到不同之处:

function fn() {
  // use strict here to see the difference
  console.log(this);
}
fn();

严格模式对 使用 调用上下文调用的函数的 this 没有影响。在这里,两个按钮都被调用 with a calling context of the button,因此无论是否使用严格模式,单击的按钮都是处理程序内部的结果 this

与 VSCode 无关 - 这就是任何地方的工作方式。

function name1() {
   document.querySelectorAll("p")[0].innerHTML += this;
}
function name2() {
   "use strict";
   document.querySelectorAll("p")[0].innerHTML += this;
}
document.querySelectorAll("button")[0].addEventListener("click", name1);
document.querySelectorAll("button")[1].addEventListener("click", name2);
<p>p</p>
<button>b1</button>
<button>b2</button>

如果您想更改特定点击处理程序中的 this,您可以

  • 使用箭头函数代替 function
  • .bind 函数,例如 .addEventListener("click", name1.bind(desiredThis));
  • 调用内部函数而不是传递它,例如.addEventListener("click", () => obj.name1());将调用obj
  • this