调用嵌套的匿名函数(javascript)

时间:2013-06-28 00:02:36

标签: javascript

我是一般的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();日志根本没有?

7 个答案:

答案 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