被Javascript弄糊涂了'It’这种行为是在特定情况下发生的

Confused by Javascript's this behaviour in a particular situation

本文关键字:在特定情况下 弄糊涂 Javascript It      更新时间:2023-09-26

我被this在这个简单的代码中发生的事情弄糊涂了:

function foo() {
    alert(this.a );
}
function doFoo(fn) {
    a = "local";
    fn();
}
var a = "global";
doFoo( foo );

据我所知,deFoo是调用foo的上下文对象,因此警报的消息应该是"local"。这是有效的,除非我在doFoo:内声明a

function doFoo(fn) {
    var a = "local";
    fn();
}

现在警报信息是"全局"。有人能向我解释一下吗?我是Javascript的新手。

需要考虑的几件事:

  1. 其中的valuefunction的调用方式决定
  2. 如果在global-context下调用function,则thiswindow(在浏览器中(
  3. 如果未使用关键字var定义variable,则它是全局变量

在您的示例中,函数doFoo中的a指的是window.a,它是local,在调用函数时被覆盖。

function foo() {
  alert(this.a);
}
function doFoo(fn) {
  console.log(window.a);
  a = "local"; //window.a is set to "local"
  fn();
}
var a = "global"; //window.a is "global"
doFoo(foo);
//Few logs to make it clear
console.log(window.doFoo);
console.log(window.a);

Javascript具有词法范围,因此在您的示例中,this总是指a的全局版本,该版本在第一个代码段中被覆盖。

由于var在该范围中定义了一个新变量,因此您没有修改全局变量,因此在第二个代码段中打印global

首先aglobal,然后我们调用doFooglobal a设置为local

我们现在调用fn(),它调用foo(),这里this指的是当前执行上下文。这里this指的是global范围。

因此提醒local

给你额外的作业:遵循类似的逻辑,为什么下面提醒global

var a = "global"
function thisA()
{
    var a = "local";
    fn();
}
function fn()
{
    alert(this.a);
}
thisA();

范围示例

1.

var a = 3;
function myA()
{
    a = 2;
}
myA();
console.log(a); // 2

2.

var a = 3;
function myA()
{
    var a = 2;
}
myA();
console.log(a); // 3

3.

var a = 3;
function myA()
{
    var a = 2;
    myOtherA();
}
function myOtherA()
{
     a = 4;
}
myA();
console.log(a); // 4 since myOtherA() sets the global var a = 3 to 4, NOT myA();

4.

var a = 3;
function myA()
{
    var a = 2;
    function withinA()
    {
        a = 10;
    }
    withinA(); // changes var a = 2, to 10 NOT the outer a =3
}

myA();
console.log(a); // Still 3