有人可以解释为什么下面的代码会失败吗?
我如何使用闭包访问 zip
函数?我想让它打印出 value1
。
function foo() {
var bar;
function zip() {
var quux = 'value1';
bar = true;
console.log(quux);
}
quux = 'value2';
console.log(quux);
return zip;
}
foo();
var a = zip;
a();
当前显示zip is not defined
。
最佳答案
您可以使用:
foo()()
或与变量赋值相同:
var a = foo();
a();
请注意,它将同时输出 value2
和 value1。
这是如何运作的?
为了更容易理解所提供的代码,请考虑以下与您的代码产生相同结果的示例:
function foo() {
var bar;
quux = 'value2';
console.log(quux);
return function() {
var quux = 'value1';
bar = true;
console.log(quux);
};
}
var a = foo(); // executes code, returns function and stores it in a variable
a(); // executes function, stored in a variable
我想,现在这段代码更容易理解 - 它执行一些代码,返回一个函数,您稍后会调用它。
现在,考虑另一个例子:
function foo() {
var bar;
quux = 'value2';
console.log(quux);
var zip = function() {
var quux = 'value1';
bar = true;
console.log(quux);
};
return zip;
}
var a = foo(); // executes code, returns function and stores it in a variable
a(); // executes function, stored in a variable
这段代码做同样的事情,但它在作为结果返回之前将一个函数存储在一个变量中。您在示例中提供的代码与上一个示例几乎没有区别,除了函数声明:
这些几乎是等价的(why almost?):
var zip = function() {
};
function zip() {
}
关于javascript - 如何从另一个函数返回一个函数然后调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33497869/