这就是我所面对的
function AAA(){ this.f1 = function (){ /*expecting that f2 will be call as both of then are of same object.*/ console.log(f2(5));// } this.f2 = function(x){ return x; } } x = new AAA(); x.f1(); //ReferenceError: f2 is not defined
它也不起作用,
function AAA(){ this.f1 = function (){ /*expecting that f2 will be call as both of then are of same object.*/ console.log(f3(5));// } /*naming the function f3 hope to get function reference, as function on the right side has name now and in the closure of f1, right?*/ this.f2 = function f3(x){ return x; } function f4() {}; } x = new AAA(); x.f1(); //ReferenceError: f3 is not defined
这里发生了什么?除了'f4'之外谁关闭'f1'?我们不能在没有'this'的情况下调用相同的对象函数吗?
答案 0 :(得分:3)
这里你并没有真正使用闭包。如果将行更改为
,它将正常工作 console.log(this.f2(5));
如果要使用闭包,可以按如下方式重写该类:
function AAA()
{
var f1 = function()
{
console.log(f2(5));
};
// f2 is a private function.
var f2 = function(x)
{
return x;
};
// Define the public interface.
return { f1: f1 };
}
答案 1 :(得分:2)
你在这里混淆了一些事情; this
和闭包是两个完全不同的问题。
您的问题在于您尝试直接引用f2
,从而假设this
是当前执行范围的一部分。 不是
如果您将f2
放在this
上,则必须继续将其引用为this.f2
。为了能够直接引用f2
,您必须按该名称声明一个(单独的)变量,如果需要,您可以将其分配给this
,如qwertymk所述。
就个人而言,我尽量避免使用this
,因为它的含义完全取决于函数的调用方式(例如,如果调用AAA
而未指定new
operator this
将引用全局对象!)。它还可以帮您避免上述问题。闭包(如Elian所示)是获得此功能的更好方法
有趣的是,我发现我几乎没有需要来使用this
。
在Elian的例子中,f2
关闭:一旦AAA函数运行完毕,没有人可以访问f2,除了在AAA内定义的函数(并且仍可访问) 。在这种情况下,可以从返回的对象访问函数f1
,因此仍然存在。因此,f1
仍然可以使用f2
这就是闭包的含义:函数仍然可以访问其范围内的所有变量,即使这些变量是在已终止的函数中声明的。
答案 2 :(得分:1)
它应该this.f2()
而不是f2()
。如果它是私有变量,则会使用f2()
,这意味着它是使用var
关键字创建的。
function AAA(){
var f3 = function(x) { return x; };
this.f1 = function (){
/*expecting that f2 will be call as both of then are of same object.*/
console.log(this.f2(5));//
console.log(f3(10));
}
this.f2 = function(x){
return x;
}
}
<强> DEMO 强>
答案 3 :(得分:0)
其他人已经告诉你问题是什么,所以我不再重复了。如果您希望代码有效,您只需要参考:
function AAA(){
var self = this;
this.f1 = function (){
console.log(self.f2(5)); //self.f2 exists, yay
}
this.f2 = function(x){
return x;
}
}
x = new AAA();
x.f1(); //5