2013-11-14 30 views
-1

在以下示例中,y如何给出1的值?我加了一些记录,看看价值观和不知道如何/其中y分配...了解Javascript函数和关闭

(function() { 
    function foo(x) { 
     var callNum = 0; 
     var baz = 3; 
     return function (y) { 
      callNum++; 
      console.log("callNum: " + callNum); 
      console.log("y: " + y); 
      console.log("baz: " + baz); 
      console.log("x: " + x); 
      console.log(x + y + (++baz)); 
     } 
    } 
var moo = foo(2); // moo is now a closure. 
moo(1); 
moo(1); 
})(); 

这里的小提琴输出日志:

callNum: 1 
    y: 1 
    baz: 3 
    x: 2 
    7 
    callNum: 2 
    y: 1 
    baz: 4 
    x: 2 
    8 
+3

问题应该是:“moo'里面有什么?”。一旦你得到了,很清楚'y'得到分配的位置;) –

+2

你为什么会期望'y'不是1? – tymeJV

+1

'y'不是“赋值”的,它被传入函数'moo',这是'foo'返回的函数。两次,你通过'1',所以它是1. –

回答

2

foo()返回的功能。这个返回的函数接受一个参数,你关心的是y

所以,当你这样做:

// returns a function that accepts `y` with `x` shared via closure 
var moo = foo(2); 

// execute the inner function, passing in a value for `y`. 
moo(1); 

foo(2)返回的功能。 x现在是2moo现在是一个函数,它接受y的值,并且您通过1。所以y现在是1


想起来了另一种方式,你可以通过执行调用的内部函数:

foo(x)(y); 

或者与值,您正在使用:

foo(2)(1); 

所以,在回答你的问题,y设置为1当你这样做:

moo(1); 
0

在您的代码:

(function() { 
    function foo(x) { 
     var callNum = 0; 
     var baz = 3; 

这些都是无关紧要(XcallNum巴兹)的参数。它们形成包括以下功能关闭:

 return function (y) { 

这个函数有一个封闭到每个外层局部变量(包括FOO)的。

  callNum++; 
      console.log("callNum: " + callNum); 
      console.log("y: " + y); 
      console.log("baz: " + baz); 
      console.log("x: " + x); 
      console.log(x + y + (++baz)); 
     } 
    } 

也有涉及moo和上述两种功能关闭,但是它没有使用,因此是不相关的结果。

var moo = foo(2); // moo is now a closure. 

其余由Alex回答。