Javascript嵌套函数失去作用域

Javascript嵌套函数失去作用域,javascript,binding,scope,Javascript,Binding,Scope,有人能解释一下下面代码的范围绑定吗 window.name = "window"; object = { name: "object", method: function() { nestedMethod: function() { console.log(this.name); } nestedMethod(); } } object

有人能解释一下下面代码的范围绑定吗

window.name = "window";

object = {
       name: "object",
       method: function() {
             nestedMethod: function() {
                   console.log(this.name);
             }
             nestedMethod();
       }
}

object.method();  // print 'window'
我想我的问题更多的是关于
这个
…为什么
这个
会失去作用域而默认为全局作用域?我们创建的所有匿名函数都将在全局范围内运行吗

window.name = "window";

object = {
    name: "object",
    method: function () {
        var self = this;
        var nestedMethod = function () {
            console.log(self.name); // or object.name without declaring self
        }
        nestedMethod();
    }
}

object.method(); // print 'object'
保存对象的范围-或使用对象本身

我们创建的所有匿名函数都将在全局范围内运行吗

window.name = "window";

object = {
    name: "object",
    method: function () {
        var self = this;
        var nestedMethod = function () {
            console.log(self.name); // or object.name without declaring self
        }
        nestedMethod();
    }
}

object.method(); // print 'object'
不,不是所有的匿名函数都会丢失其作用域,所有的作用域都绑定到全局对象(如果没有使用特定的
this
调用它们,请参见
应用
调用
,请参见下面的示例)

任何这样调用的函数:

someFunction();
Super.prototype.someFunc = function() {
  this.nestedFunc = function() {}
  //now call it
  this.nestedFunc()
}
将全局范围作为
的值(在非严格模式下)。您可以将外部作用域隐藏在局部变量中,或者使用
.call()
.apply()


无论何时调用函数,只要在函数中写入
func()
将指向全局对象。在你的情况下,你写:

nestedMethod();
因此,
这个
内部的
嵌套方法
就是窗口对象。您可以使用
call
(或
apply
)手动定义函数调用的上下文:

nestedMethod.call(this);

您应该像这样声明嵌套函数:

someFunction();
Super.prototype.someFunc = function() {
  this.nestedFunc = function() {}
  //now call it
  this.nestedFunc()
}

您可以尝试使用对象的名称,因此
object.name
。否。默认情况下,所有函数都在全局范围内,除非作为属性绑定到对象…@dandavis这确实不准确。函数本质上根本不“继续”任何作用域。
的值由每次调用函数的情况决定。当我在node.js中尝试它时,它会为我打印
“object”
(一旦我将
放在
对象
的赋值之后)。
嵌套方法:function(){
看起来像一个标签,而不是一个变量或函数名。不管怎样,。你是说所有函数的作用域都是全局对象?你是说我可以直接调用全局作用域上的nestedMethod?仅供参考,因为作用域不正确(至少在我看来你这样做了)。“所有函数的作用域都是全局对象“--我认为这有点不准确。
this
未绑定的函数将在窗口上下文中运行,但作用域仍然是最接近的函数。我的坏函数,已经编辑过。总之@elclars这不是完全正确,
this
将更改为全局作用域,即使我们使用
.call(thisArg)
,其中
thisArg
被定义为
null
undefined
您的意思是像这样调用的任何函数,无论它被调用的是哪个作用域以及它被定义在哪里?@user1389813是的,这是正确的。任何简单调用的函数(不是使用
.call()
.apply())
,不使用
new
,也不通过对象属性引用,如
foo.myFunc()
)将导致
的值在非严格模式下为
窗口
(全局)对象,在严格模式下为
未定义的