JavaScript关闭问题了!

时间:2011-02-17 06:51:24

标签: javascript closures

这就是我所面对的

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'的情况下调用相同的对象函数吗?

4 个答案:

答案 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