在哪些对象上是定义函数的局部范围内的变量



那么在下面的代码中,y在哪个对象上定义?它输出到三个,如下所示;当然,var y 是局部范围的,所以我认为变量 y 的作用域为对象sx。但仍然给我undefined..我知道alert(y)会给我三个,但这不是我的问题。我想知道它是否在以下代码中的函数中本地作用域,则在哪个对象上定义它。

var s = function x() {
    var y = 3;
    alert(y); // y is defined on what object? //results 3
    alert(window.y); //local scope so obviously this won't be true
    alert(s.y); //undefined? why //expected 3 
    alert(x.y); //undefined? why //expexted 3
}
s();

你可以这样想 - 每次调用函数时,都会创建一个新的匿名对象,其中包含函数的所有局部变量。

当你说s.x时,它指的是函数s(这也是它自己的对象(,而不是上一段中的匿名对象。请注意,只有一个s函数,但每次创建新的匿名对象时都可以多次调用它。

以下是您的代码在幕后的实际外观*:

var s = function x(_ctx) {
   _ctx.y = 3;
   alert(_ctx.y); // locals are looked up in _ctx
   alert(window.y); // 
   alert(s.y); // not looking in _ctx, but in s
   alert(x.y); // ditto, as x === s
}
s({});

*(嗯,在某种程度上..

function x 范围内声明的y。它与任何对象无关。 s是同一个x.它指的是一个函数。函数是可调用的对象,可以通过s.yx.y分配自己的属性,但是通过var, const, letfunction在其中声明的所有内容都与其对象本身无关,而是上下文。因此,y是一个简单的变量,只是在function的上下文中限定范围。

最新更新