我习惯于将所有变量都设置为它的父作用域,而不是隐式调用它们:
function outer() {
var x, y;
function inner() {
var x = this.x;
x = ...// doing stuff here
y = ....// implicit calling parent variable
}
}
这样,如果我输入了错误的变量,它就不会进入全局空间。但是看起来在私有函数中带有this
的声明变量将返回undefined
function f() {
var x = [0];
function f1() {
console.log('f1:', this.x, x);
f2();
}
function f2() {
console.log('f2:', this.x, x);
}
return { x:x , f1:f1 };
}
var foo = f();
foo.f1();
//output
f1: [0] [0]
f2: undefined [0]
如果我理解正确的话,应该不会发生这种情况,因为f1
和f2
都应该能够通过使用this
访问它的外部作用域。这里有什么我遗漏的概念吗?或者这是我现在不得不接受的事情?
更新:为了澄清,我主要关心的是为什么f1
和f2
之间存在差异。我更喜欢隐藏f2
,因为它会做一些内部工作,其他开发人员在从f()
声明某些东西时不应该使用它。
发布于 2013-03-18 21:20:14
也可以试试这个:
function f() {
var x = [0];
function f1() {
console.log('f1:', this.x, x);
f2.call(this);
}
function f2() {
console.log('f2:', this.x, x);
}
return { x:x , f1:f1 };
}
var foo = f();
foo.f1();
这样就可以正确地设置f2的上下文。
在您的代码中,f2中的this
引用了window对象,因为f2没有声明为方法。在编写{ x:x , f1:f1 }
时,f1被声明为返回对象的方法。在f2中,x是可见的,不是因为它在f()的作用域中运行,而是因为f2将其作为闭包获取。这意味着在f2中,所有在创建时处于相同作用域的变量都是可见的。
this
引用的内容将在调用时设置。如果您将一个函数作为像foo.f1()
这样的对象的属性来运行,它将被视为一个方法,并且this
将被设置为该对象。但是,当您只是调用一个像f2()
这样的函数时,作用域将与在其中调用它的作用域相同,在本例中它是window对象,因为foo是window对象中的全局对象。
在f1中,这指的是隐藏的f(),因此,如果您希望f2也在该作用域中运行,则可以使用f2.call(this)
。运行时,.call()的参数将是函数的this
。
发布于 2013-03-18 21:12:24
当你的f
函数返回一个对象时,它没有f2
方法。f2
方法是f
的内部方法,只存在于它的作用域中。
如果您使用以下代码:
function f() {
var x = [0];
function f1() {
console.log('f1:', this.x, x);
this.f2();
}
function f2() {
console.log('f2:', this.x, x);
}
return { x:x , f1:f1, f2:f2};
}
var foo = f();
foo.f1();
然后,f1
方法中的this
将可以访问this
的f2
方法,对象的f2
方法将返回正确的x
。
发布于 2013-03-18 21:15:45
您从函数返回了以下内容:
{ x : x, f1 : f1 }
这会将this
对象属性设置为上述属性。f2
不是对象的一部分,所以它不能访问它引用的this
。
https://stackoverflow.com/questions/15486830
复制相似问题