那么在下面的代码中,y
在哪个对象上定义?它输出到三个,如下所示;当然,var y 是局部范围的,所以我认为变量 y 的作用域为对象s
或x
。但仍然给我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.y
或x.y
分配自己的属性,但是通过var, const, let
或function
在其中声明的所有内容都与其对象本身无关,而是上下文。因此,y
是一个简单的变量,只是在function
的上下文中限定范围。