3

I"m new to Javascript and programming in general and came upon this block of code from a book called Javascript Enlightenment (p.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 */

Why does setting var nestedFunction = parentFunction(); enable nestedFunction(); to invoke the nested anonymous function and log "foo" to the console whereas using just parentFunction(); logs nothing at all?

4

6 回答 6

4

调用parentFunction返回匿名函数而不调用它。

nestedFunction被设置为匿名函数parentFunction的返回。

nestedFunction因此调用会调用匿名函数

匿名函数使用所以console.log你看"foo"

于 2013-06-28T00:06:16.567 回答
3

基本上你在做:

parentFunction()(); // double parenthesis

括号表示您执行该函数,该函数将返回一个值。如果该值为 afunction您可以执行它。

如果你只调用一次,那么你就得到了这个函数,所以什么都console.log没有

于 2013-06-28T00:05:14.420 回答
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"
于 2013-06-28T00:28:11.367 回答
1
function add (x) {
    return function (y) {
        return x + y;
    };
}
var add5 = add(5);
 add5(3);

解释:

当调用 add 函数时,它返回一个函数。该函数关闭上下文并记住参数 x 在那个时候是什么(即上面代码中的 5) 当调用 add 函数的结果被分配给变量 add5 时,它总是知道 x 最初是什么创建的。上面的 add5 变量是指一个函数,它总是将值 5 添加到正在发送的内容中。这意味着当 add5 被调用时值为 3 ,它将 5 和 3 相加,并返回

请参考这个链接...

http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

于 2014-08-19T12:33:27.353 回答
0

因为parentFunction正在返回嵌套函数,需要调用它才能运行。

var a = nestedFunction;

不记录任何东西,因为它还没有被执行,直到你这样做:

a();
于 2013-06-28T00:06:22.407 回答
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 变量外什么也不输出。并且该函数引用可以像任何其他函数一样调用。

于 2013-06-28T00:21:28.433 回答