Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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_Function_Closures - Fatal编程技术网

为什么其中一个是结束,而不是另一个?Javascript

为什么其中一个是结束,而不是另一个?Javascript,javascript,function,closures,Javascript,Function,Closures,我一直在阅读JS中的闭包,我不会说我完全理解它,但至少在阅读了一些来自不同站点的示例和信息后,我对它有了一些了解,但我真的不明白为什么其中一个是闭包而不是另一个 非闭合函数 var secret = "007"; function getSecret(){ var secret = "008"; function getValue(){ return secret; } return getValue(); } getSecret();

我一直在阅读JS中的闭包,我不会说我完全理解它,但至少在阅读了一些来自不同站点的示例和信息后,我对它有了一些了解,但我真的不明白为什么其中一个是闭包而不是另一个

非闭合函数

var secret = "007";

function getSecret(){
    var secret = "008";

    function getValue(){
        return secret;
    }

    return getValue();
}

getSecret();
var secret = "007";

function getSecret(){
    var secret = "008";

    function getValue(){
        return secret;
    }

    return getValue;
}

var getValueFun = getSecret();
getValueFun();
关闭功能

var secret = "007";

function getSecret(){
    var secret = "008";

    function getValue(){
        return secret;
    }

    return getValue();
}

getSecret();
var secret = "007";

function getSecret(){
    var secret = "008";

    function getValue(){
        return secret;
    }

    return getValue;
}

var getValueFun = getSecret();
getValueFun();
这两个函数都有相同的输出,因为我可以意识到第一个不是闭包的函数返回调用的函数,而闭包函数只返回函数。这是我能想到的唯一区别,也是其中一个是闭包而不是另一个的部分原因吗?

//您可以尝试以下方法:

var secret = "007";

function getSecret(){
    var secret = "008";

    var getValueFunc = function(){
        return secret;
    }

    return {
         getValue:getValueFunc
   };
}

var getValueFun = new getSecret();
getValueFun.getValue();

是的,这就是关键区别。第一个返回
getValue
函数的结果-第二个返回
getValue
函数本身-因此,在第二个示例中,为什么需要执行
getValueFun()
获取第一个函数的结果。谁说?一个函数引用了它在其中创建的环境(或任何环境),它就是一个闭包。@Bergi说如果一个内部函数返回外部函数中的所有自由变量,它就是一个闭包,这有什么不同吗?它如何帮助理解?您不应该
从使用
new
调用的构造函数中返回对象。