所以在下面的代码中,定义了什么对象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();
答案 0 :(得分:3)
您可以这样想 - 每次调用函数时,都会创建一个包含函数的所有局部变量的新匿名对象。
当你说s.x
时,它引用函数s
(它也是它自己的对象),但不引用前一段中的匿名对象。注意如何只有一个{ {1}}函数,但每次都可以调用它,每次创建一个新的匿名对象。
以下是您的代码在幕后实际看起来的样子:
s
*)好吧,在某种程度上......
答案 1 :(得分:2)
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({});
范围内声明的 y
。它与任何对象无关。 function x
与s
相同。它指的是一个功能。函数是可调用对象,可以通过x
或s.y
分配自己的属性,但是通过x.y
或var, const, let
在其中声明的所有内容与其对象本身无关,但这是背景。所以function
是一个简单的变量,只是在y
的上下文中。