关于javascript中的闭包需要很少的澄清

时间:2015-08-11 15:18:28

标签: javascript

我正在浏览关于闭包的mozilla文档,我想知道为什么以下代码不起作用。有人可以澄清为什么以下不会起作用,而定义一个变量并调用它有效。

var outerFunction = function(inp) {
    var input = inp;
    var innerFunction = function() {
         console.log(inp);
    };
    return innerFunction;
};

outerFunction(32); //returns nothing

vs

var outerFunction = function(inp) {
    var input = inp;
    var innerFunction = function() {
         console.log(inp);
    };
    return innerFunction;
};

 var newFunc =    outerFunction(32);
 newFunc();    // returns 32

谢谢,对不起,如果这是一个愚蠢的问题。

4 个答案:

答案 0 :(得分:2)

第二个代码执行你作为第一个函数的返回对象获得的函数(注意你的函数返回一个需要被调用才能执行的函数)。你可以让返回函数自我调用,然后它可以在不将它分配给另一个变量的情况下工作:

 var outerFunction = function(inp) {
    var input = inp;
    var innerFunction = function() {
         console.log(inp);
   };
   return innerFunction;
};

(outerFunction(32)()) //returns 32

答案 1 :(得分:1)

img/p/2/5/返回一个函数,但在第一个例子中,该函数永远不会被调用。

outerFunction

答案 2 :(得分:1)

您的第一段代码不会返回任何内容,它会返回Function object,或者您在第二个代码段中分配给newFunc的内容:

var outerFunction = function(inp) {
    var input = inp;
    var innerFunction = function() {
         console.log(inp);
   };
   return innerFunction;
};

console.dir(outerFunction(32));

enter image description here

如果您希望返回其值,则需要使用括号调用返回的函数,就像您在第二个代码段中调用newFunc()一样:

(outerFunction(32)());
// 32

答案 3 :(得分:0)

return innerFunction;指令返回一个函数对象(innerFunction函数的一个实例),而不是它的执行。这就是为什么你需要"实例化"它与

var newFunc = outerFunction(32);

然后用

执行它
newFunc();

outerFunction就像一个函数工厂:它创建一个必须执行才能得到结果的函数。