1

"use strict"模式中,this函数中应该是[object Window]而不是在常规模式下调用函数的对象。但是当我试图证明概念时,它不起作用,我想知道 Visual Studio Code 中的 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);
4

1 回答 1

3

关于this,严格模式意味着在没有任何调用上下文的情况下调用的函数(不在对象上的未绑定函数)将接收 a thisofundefined而不是全局对象。

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

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

严格模式对使用调用上下文调用this的函数没有影响。在这里,两个按钮都是通过 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());调用thisobj
于 2021-03-15T05:18:03.947 回答