Javascript评估问题(第2部分)

时间:2010-11-19 18:27:30

标签: javascript

(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); })();
        })();
    })();
})();

我正在从课堂上的教科书中解决一些问题,为下一次考试做准备,并且无法弄清楚上面的评估方式。

大多数情况下,我不理解调用z = g(f),因为当评估f时,它没有提供参数,那么它是如何评估的呢?怎么知道你是什么? g(f)会评估什么?

另外,就范围而言,我相信javascript将大部分内容视为全局变量,因此设置的最后一个x将是函数f中使用的x值,对吗?

感谢您的帮助!

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

5 个答案:

答案 0 :(得分:1)

g(f)的情况下,函数f未被计算,而是作为对象/值传递。函数是javascript中的值,可以这样传递。函数g稍后通过表达式f评估函数h(x)(因为f作为参数传递h

这是一个更直接的例子

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

答案 1 :(得分:1)

有助于更好地格式化和缩进,以便更容易调查发生的事情:

(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
            })()
        })()
    })()
})()

答案 2 :(得分:1)

函数中定义的变量作用于该函数。如果这是真正的一个类,你应该从那里找出其余部分。

答案 3 :(得分:0)

  

大多数情况下,我不理解这个电话   z = g(f),当评估f时,它   没有提供论据,所以如何   它会评估吗?怎么做的   知道你是什么? g(f)会是什么   评价到?

如果你看一下g的实施方式:

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

它需要一个参数h,这是一个Function,然后将其称为h(x)。我希望这可以帮助您了解z = g(f)最终如何运行函数f

  

另外,就范围而言,我   相信javascript对待最多   一切都是全局变量,所以   设置的最后一个x将是x   函数f中使用的值,正确吗?

不正确的。使用var语句时,将定义本地范围中的新变量。在您的情况下,最终x不是全局的。

答案 4 :(得分: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);
            })()

x是一只红鲱鱼;它会影响外层,并且从未实际使用过。然后我们调用g,传递f。继续上面g,我们看到f成为正式参数h,并且在7 f中调用y(5 + 7) - 2成为x。所以我们得到{{1}},10。由于阴影,等同于其他代码。

外部{{1}}永远不会被修改,只是被遮蔽。