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()
)将导致此
的值在非严格模式下为窗口
(全局)对象,在严格模式下为未定义的
。