这个变量来自哪里

时间:2013-06-30 22:27:51

标签: javascript

这是How do JavaScript closures work?。第一个答案对我来说没有任何意义,我无法评论它。这非常令人沮丧

function foo(x) {
  var tmp = 3;
  return function(y) {
    alert(x + y + (++tmp));
  }
}
var bar = foo(2); // bar is now a reference to the closure returned by foo
bar(10);

这是什么意思? y变量来自哪里?

3 个答案:

答案 0 :(得分:4)

变量的来源:

function foo(x) {       // x introduced
  var tmp = 3;          // tmp introduced
  return function (y) { // y introduced
    // Can access all variables in scope, as introduced above.
    // However, ONLY x and tmp are closed-over as y is just a parameter
    // to the inner function.
    alert(x + y + (++tmp));
  }
}

var bar = foo(2);  // 2 is value for x
bar(10);           // 10 is value for y

现在,看得更深一点:

foo(2)返回 new 函数对象(内部函数),它绑定到两个变量(x当前值为2,tmp当前值为3)

然后bar(10) 运行传递10的函数对象(然后是y的值)。

重复调用bar(10)将导致不同的值,因为在函数调用期间重新绑定变量tmp++tmp)。< / p>

答案 1 :(得分:3)

您需要区分变量(包含信息的内存的名称)和参数(要传递给函数的变量的占位符)。 (实际上它在函数原型中称为形式参数,在函数体中使用时称为实际参数。) 因此y不是现有变量,而是传递变量(或值)的占位符。

然后,您需要了解var func = function(){}func转换为对匿名函数(没有名称的函数)的引用。 一个简化的例子是:

var func = function (y) {
   alert(y);
}
func("hello");

你可以从那里开始工作。其他一切都是以嵌套的方式应用的原理。

答案 2 :(得分:0)

foo正在返回一个函数,它接受一个名为y的参数。

因此,当你调用foo时,你会得到一个函数,你可以随时使用参数执行该函数,该函数变为y的值。

请注意,返回的函数是匿名的,但是当foo返回它时,您可以有效地将函数绑定到变量。在这里,正在调用foo,并且返回值被分配给bar

现在,你可能会问“好吧,如果函数返回有参数y,我调用bar(10),现在y被赋予值10,但是现在是什么x

好吧,x已经有了一个值,它在第一次调用foo时得到了。这是一个“工作流程”表示。

  1. 定义了一个名为foo的函数,它接受一个参数x。它返回一个匿名函数,它接受一个名为y的参数。
  2. 调用函数foo,其值x等于2,并且它的返回值绑定到barbar现在是对匿名函数的引用,其中x的所有值都等于调用x foo的值,即2。
  3. 当使用bar调用绑定到bar(10)的匿名函数时,参数y的值为10bar执行以下

    警告(2 + 10 +(+ tmp));

  4. 所以你现在可能会问,“那是什么?”好吧,如果你按照上面的说法,这应该是合理的直接推断。当从foo返回匿名函数时,任何本地变量的引用都绑定到值foo有一个