Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript闭包问题又来了!_Javascript_Closures - Fatal编程技术网

JavaScript闭包问题又来了!

JavaScript闭包问题又来了!,javascript,closures,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(); //Re

这就是我面临的问题

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 函数AAA(){ this.f1=函数(){ /*期望f2将被调用,因为它们都是相同的对象*/ 控制台日志(f2(5))// } this.f2=函数(x){ 返回x; } } x=新的AAA(); x、 f1()//ReferenceError:未定义f2 也不管用,

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 函数AAA(){ this.f1=函数(){ /*期望f2将被调用,因为它们都是相同的对象*/ 控制台日志(f3(5))// } /*命名函数f3希望得到函数引用,作为函数 右边有名字现在和f1的结尾,对吗*/ this.f2=功能f3(x){ 返回x; } 函数f4(){}; } x=新的AAA(); x、 f1()//ReferenceError:未定义f3 这里发生了什么?除了“f4”之外,还有哪些人在关闭“f1”?我们不能在没有“this”的情况下调用同一个对象函数吗?

它应该是
this.f2()
而不是
f2()
本身。如果它是一个私有变量,也就是说,如果它是用
var
关键字创建的,则可以使用
f2()

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;
    }
}

它应该是
this.f2()
而不是
f2()
本身。如果它是一个私有变量,也就是说,如果它是用
var
关键字创建的,则可以使用
f2()

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;
    }
}

您在这里并没有真正使用闭包。如果你把线路改成

 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 };
}

您在这里并没有真正使用闭包。如果你把线路改成

 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 };
}

你在这里混淆了一些事情<代码>此和闭包是两个完全不同的问题

这里的问题是您试图直接引用
f2
,从而假设
是当前执行范围的一部分它不是
如果将
f2
放在
this
上,则必须继续将其引用为
this.f2
。为了能够直接引用
f2
,您必须按照该名称声明一个(单独的)变量,然后您可以根据需要将其分配给
,如所述

就我个人而言,我尽量避免使用
这个
,因为它的意义完全取决于函数的调用方式(例如,如果调用
AAA
时没有指定
新的
操作符,
这个
将引用全局对象!)。它还可以让你避免像上面那样的头痛。闭包(如所示)是获得此功能的更好方法。
有趣的是,我发现我几乎不需要使用
这个

在Elian的例子中,
f2
被关闭:一旦AAA函数完成运行,除了AAA内部定义的函数(仍然可以访问)之外,没有人可以访问f2。在这种情况下,可以从返回的对象访问函数
f1
,因此该函数仍然存在。因此,
f1
仍然可以使用
f2


这就是闭包的含义:函数仍然可以访问其作用域中的所有变量,即使这些变量是在已终止的函数中声明的。

您在这里混淆了一些事情<代码>此和闭包是两个完全不同的问题

这里的问题是您试图直接引用
f2
,从而假设
是当前执行范围的一部分它不是
如果将
f2
放在
this
上,则必须继续将其引用为
this.f2
。为了能够直接引用
f2
,您必须按照该名称声明一个(单独的)变量,然后您可以根据需要将其分配给
,如所述

就我个人而言,我尽量避免使用
这个
,因为它的意义完全取决于函数的调用方式(例如,如果调用
AAA
时没有指定
新的
操作符,
这个
将引用全局对象!)。它还可以让你避免像上面那样的头痛。闭包(如所示)是获得此功能的更好方法。
有趣的是,我发现我几乎不需要使用
这个

在Elian的例子中,
f2
被关闭:一旦AAA函数完成运行,除了AAA内部定义的函数(仍然可以访问)之外,没有人可以访问f2。在这种情况下,可以从返回的对象访问函数
f1
,因此该函数仍然存在。因此,
f1
仍然可以使用
f2


这就是闭包的含义:函数仍然可以访问其作用域中的所有变量,即使这些变量是在已终止的函数中声明的。

其他人已经告诉您问题所在,因此我不再重复。如果希望代码正常工作,只需引用以下内容:

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

其他人已经告诉你问题所在,所以我不再重复。如果希望代码正常工作,只需引用以下内容:

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

是的,我明白你的意思,但我想知道谁是f1的闭包,或者为什么我们不能在没有“this”的情况下调用相同的对象函数?机制是什么。@abdullah829:在其他语言中,如果您指的是同一对象的另一个成员,则可以省略“this”。在javascript中不能这样做。如果您只写“f2”并省略“this”,那么javascript将开始查找具有此名称的局部变量,然后进入作用域链(闭包),最后查看全局作用域(窗口对象)。这很好!谢谢你们,若你们命名一个函数,比如第二个例子,会发生什么呢。。。其中名称为f3,如果您没有将其分配给this.f2,它是否可以正常工作?是的,我明白你的意思,但我