我是一般的Javascript和编程新手,并从一本名为 Javascript Enlightenment 的书(第88页)中找到了这段代码:
var parentFunction = function() {
var foo = 'foo';
return function() { // anonymous function being returned
console.log(foo); // logs 'foo'
}
}
// nestedFunction refers to the nested function returned from parentFunction
var nestedFunction = parentFunction();
nestedFunction(); /* logs foo because the returned function accesses foo
via the scope chain */
为什么设置var nestedFunction = parentFunction();
使nestedFunction();
能够调用嵌套的匿名函数并记录" foo"到控制台而只使用parentFunction();
日志根本没有?
答案 0 :(得分:4)
调用parentFunction
会返回匿名函数,而不会调用它。
nestedFunction
被设置为parentFunction
,匿名函数的返回。
调用nestedFunction
因此调用匿名函数。
匿名函数使用console.log
,因此您会看到"foo"
。
答案 1 :(得分:3)
基本上你在做:
parentFunction()(); // double parenthesis
括号表示您执行该函数,该函数将返回一个值。如果该值为function
,则可以执行该值。
如果你只打电话一次,那么,你只是得到了这个功能,所以没有得到console.log
ged
答案 2 :(得分:1)
代码的替代方法是
var parentFunction = function() {
var foo = "foo";
return console.log.bind(console);
}
parentFunction()();
// => "foo"
不可避免地,你会想要在某些时候对范围做些什么,所以你就这样做了
var parentFunction = function() {
this.foo = "foo";
this.something = function(){
console.log(this.foo);
}
return this.something.bind(this);
}
parentFunction()();
// => "foo"
答案 3 :(得分:1)
function add (x) {
return function (y) {
return x + y;
};
}
var add5 = add(5);
add5(3);
<强>解释强>
调用add函数时,返回一个函数。 该函数关闭上下文并记住参数x恰好在那个时间(即上面代码中的5) 当调用add函数的结果被赋给变量add5时,它将始终知道最初创建时的x是什么。 上面的add5变量指的是一个函数,它总是将值5添加到正在发送的内容中。 这意味着当使用值3调用add5时,它将与3一起添加5,并返回
请参阅此链接......
http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/
答案 4 :(得分:0)
因为parentFunction
正在返回嵌套函数,需要调用该函数才能运行。
var a = nestedFunction;
不会记录任何内容,因为它尚未执行,直到您执行此操作:
a();
答案 5 :(得分:0)
将代码重写为:
var nestedFunction = null;
var parentFunction = function() {
var foo = 'foo';
nestedFunction = function() { // anonymous function being returned
console.log(foo); // logs 'foo'
}
}
parentFunction();
// outputs nothing
// but initializes nestedFunction by its local function
nestedFunction(); /* logs foo because that local function has access to local 'foo' of
the parent function */
如您所见,父函数只输出函数引用初始化nestedFunction变量。并且该函数引用可以作为任何其他函数调用。
答案 6 :(得分:0)
这是我从在线教程中学到的:
function connect() {
return function() {
return 'Hi there'
}
}
当我们像这样简单地调用原始函数时
connect()
我们没有立即看到任何东西,但是,如果我们添加另一组括号,那么我们可以看到 Hi 。
connect()() // Hi there