2010-11-19 120 views
2
(function() { 
    var x = 5; 

    (function() { 
     function f(y) { return (x+y)-2 }; 

     (function() { 
      function g(h) { var x = 7; return h(x) }; 

      (function() { var x=10; z=g(f); })(); 
     })(); 
    })(); 
})(); 

我正在通过我的课堂上的一些问题来为我们的下一次考试做准备,并且无法弄清楚以上评估的方式。Javascript评估问题(第二部分)

大多数情况下,我不明白调用z = g(f),因为当f被评估时,它没有提供参数,所以它如何评估?它怎么知道你是什么? g(f)将评估什么?

另外,据范围去看,我相信javascript会将大多数所有东西视为全局变量,因此设置的最后一个x将是函数f中使用的x值,是正确的吗?

感谢您的帮助!

请注意,这些是我正在练习准备考试的书后面的额外问题,这些不是直接的作业问题。

+0

这不是你刚才问的那个问题吗?减少包装功能。 – 2010-11-19 18:29:37

+0

@meder,它是相似的,但不一样。 – 2010-11-19 18:31:54

+0

@Matthew Flaschen - 我知道代码并不完全一样,但在最后回答中给他的提示应该足以解决这个问题。 – 2010-11-19 18:34:06

回答

1

在这种情况下,g(f)函数f不计算,而是作为对象/值传递。函数是javascript中的值,可以像这样传递。该功能g后来通过表达h(x)计算函数f

这里有一个更直接的例子

var addOne = function(x) { return x+1; } 
var f = addOne; 
var value = f(4); // Returns 5 
1

它有助于有更好的格式和缩进,使得它更容易(因为f作为参数h通过)以调查发生了什么:

(function() { 
    var x = 5; 
    (function() { 
     function f(y) { // <-- y is the x from function g 
      return (x + y) - 2 
     }; 
     (function() { 
      function g(h) { 
       var x = 7; // <-- local x is defined and passed to f 
       return h(x) // <-- h === f 
      }; 
      (function() { 
       var x = 10; 
       z = g(f); // <-- f is passed to g 
      })() 
     })() 
    })() 
})() 
+0

谢谢,我正在尝试格式化它,但它让我很困惑。 ;) – OogaBooga 2010-11-19 18:37:30

1

函数中定义的变量被限定为该函数的作用域。如果这真的是一个班,你应该从那里弄清楚其余的部分。

0

大多数情况下,我不明白的通话 Z =克(F),当f的评估,它 不提供参数,所以如何 它在所有的评价? 如何知道y是什么? g(f) 会评估什么?

如果你看一下g是如何实现的:

function g(h) { var x = 7; return h(x) }; 

它需要一个参数h,这是一个Function,然后调用它作为h(x)。我希望这可以帮助你了解z = g(f)如何结束运行功能f

此外,据作用域推移,我相信 JavaScript的对待最 一切为全局变量,这样设置是在函数f使用的X 值,正确的 最后x?

不正确。当使用var语句时,将定义本地作用域中的新变量。在你的情况下,最后的x不是全球性的。

+0

我很感谢你的回答,我想我的问题是g(f)评估的是什么?我猜想,就像我问的最后一个问题,它评估为10 + 7-2。 – OogaBooga 2010-11-19 18:57:05

+0

ref:http://stackoverflow.com/questions/4227972/javascript-evaluation-questions – OogaBooga 2010-11-19 18:58:53

0

我也beautified它为了可读性。

(function() { 
    var x = 5; 

这将设置一个局部变量x至5

(function() { 
     function f(y) { 
      return (x + y) - 2 
     }; 

这就产生了一个局部函数f;注意,上述x(目前5)中是关闭的。

 (function() { 
      function g(h) { 
       var x = 7; 
       return h(x) 
      }; 

我们定义一个函数g采用一个函数h作为参数。它有一个局部变量x,这影响了另一个。

  (function() { 
       var x = 10; 
       z = g(f); 
      })() 

This x is a red herring;它会影响外围的一个,并且从未实际使用过。然后我们打电话g,通过f。上面到g,我们看到f变成正式参数h,并且用7调用。在f中,这变成了y。所以我们得到(5 + 7) - 2,10。由于阴影,它是而不是相当于其他的代码。

外层x从不修改,只是被遮蔽。