Javascript 在什么对象上定义的函数的局部范围内的变量?

Javascript 在什么对象上定义的函数的局部范围内的变量?,javascript,Javascript,在下面的代码中,y是在什么对象上定义的?它输出到三个,如下所示;当然,变量y的作用域是局部的,所以我认为变量y的作用域是对象s或x。但仍然给我未定义的。。我知道alerty会给我三个,但这不是我的问题。我想知道它是在什么对象上定义的,如果它在像下面代码这样的函数中是局部作用域 var s = function x() { var y = 3; alert(y); // y is defined on what object? //results 3 alert(windo

在下面的代码中,y是在什么对象上定义的?它输出到三个,如下所示;当然,变量y的作用域是局部的,所以我认为变量y的作用域是对象s或x。但仍然给我未定义的。。我知道alerty会给我三个,但这不是我的问题。我想知道它是在什么对象上定义的,如果它在像下面代码这样的函数中是局部作用域

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({});

*嗯,在某种程度上,你可以这样想——每次调用函数时,都会创建一个新的匿名对象,其中包含函数的所有局部变量

当你说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({});


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

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

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

我不明白为什么这里的变量不是函数x的属性,因为函数是objects@user8783104函数是对象,基本上通过object.prop语法向该对象添加属性。但是你只是声明了一个简单的变量,比如你的函数x,唯一的区别是,y在函数外部不可见。是的,我知道我可以通过oboj.prop访问属性,这正是为什么我不明白为什么变量在这里不被视为属性,也不能被访问。函数只会减少对该变量的访问,它没有添加到它的objectok,那为什么全局范围的变量会添加到window对象中呢?我不明白为什么这里的变量不是函数x的属性,因为函数是objects@user8783104函数是对象,基本上通过object.prop语法向该对象添加属性。但是你只是声明了一个简单的变量,比如你的函数x,唯一的区别是,y在函数外部不可见。是的,我知道我可以通过oboj.prop访问属性,这正是为什么我不明白为什么变量在这里不被视为属性,也不能被访问。函数只会减少对该变量的访问,它没有添加到它的objectok,那为什么全局范围的变量会添加到window对象中呢?他们的访问权限没有增加吗?这本书似乎是范围和上下文的好读物:这本书似乎是范围和上下文的好读物:谢谢!帮了大忙。那么我如何访问匿名对象的局部变量呢?我还想知道为什么在全局范围内,ctx.y和s.y/x.y都指对象窗口?基本上,为什么它与这里的情况不同,或者在幕后发生了我不知道的其他事情?所以globals在另一个globals对象中。。在浏览器中,它被称为window,但这只是给它起的一个名称,而这个名称只是来自全局对象的属性,因此,除了window之外,您还可以通过例如window.window.window获得它。至于访问locals对象,规范明确指出ECMAScript程序不可能访问执行上下文,因此运气不佳。。你能得到的最多的是magic arguments变量,但它不包含局部变量,只包含函数的参数,也没有名称..这对我来说真的很清楚。。。我希望书籍会这样解释,它们声明局部变量的作用域是函数,而不是函数的参数对象。你有记录吗
我想找一本好的参考书来教/展示幕后的场景,或者一本学习javascript概念的好书?对不起,我不能推荐一本书,因为我没有读过任何关于javascript的书,我的意思是:。。如果您真的想了解详细信息,那么可以阅读语言规范。。这些东西在第十章中。好的,谢谢。你还知道其他好的资源吗?不一定是书。谢谢!帮了大忙。那么我如何访问匿名对象的局部变量呢?我还想知道为什么在全局范围内,ctx.y和s.y/x.y都指对象窗口?基本上,为什么它与这里的情况不同,或者在幕后发生了我不知道的其他事情?所以globals在另一个globals对象中。。在浏览器中,它被称为window,但这只是给它起的一个名称,而这个名称只是来自全局对象的属性,因此,除了window之外,您还可以通过例如window.window.window获得它。至于访问locals对象,规范明确指出ECMAScript程序不可能访问执行上下文,因此运气不佳。。你能得到的最多的是magic arguments变量,但它不包含局部变量,只包含函数的参数,也没有名称..这对我来说真的很清楚。。。我希望书籍会这样解释,它们声明局部变量的作用域是函数,而不是函数的参数对象。你有没有推荐一本好的参考书来教授/展示幕后的内容,或者一本学习javascript概念的好书?对不起,我不能推荐一本书,因为我没有读过任何关于javascript的书,我的意思是:。。如果您真的想了解详细信息,那么可以阅读语言规范。。这些东西在第十章中。好的,谢谢。你还知道其他好的资源吗?不一定是书。