我正在浏览关于闭包的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
谢谢,对不起,如果这是一个愚蠢的问题。
答案 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));
如果您希望返回其值,则需要使用括号调用返回的函数,就像您在第二个代码段中调用newFunc()
一样:
(outerFunction(32)());
// 32
答案 3 :(得分:0)
return innerFunction;
指令返回一个函数对象(innerFunction
函数的一个实例),而不是它的执行。这就是为什么你需要"实例化"它与
var newFunc = outerFunction(32);
然后用
执行它newFunc();
outerFunction
就像一个函数工厂:它创建一个必须执行才能得到结果的函数。