2010-11-19 2 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 Вопросы оценки (часть 2)

В основном, я не понимаю вызов z = g (f), как и при оценке f, ему не предоставлен аргумент, так как он вообще оценивается? Как он знает, что такое y? Что будет оценивать g (f)?

Кроме того, насколько мне известно, javascript рассматривает большинство всего как глобальные переменные, поэтому последний установленный x будет значением x, используемым в функции f, правильно?

Спасибо за помощь!

Обратите внимание, что это дополнительные проблемы в задней части книги, которую я практикую, чтобы подготовиться к экзамену, это не прямые домашние вопросы.

+0

Разве это тот же вопрос, который вы только что задали? Минус обертывания. –

+0

@meder, это похоже, но не то же самое. –

+0

@Matthew Flaschen - Я знаю, что код не совсем то же самое, но подсказки, данные ему в последнем ответе, должны дать ему достаточно, чтобы решить эту проблему. –

ответ

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

Это помогает иметь лучшее форматирование и отступы так, что легче чтобы выяснить, что происходит:

(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

1

Переменные, определенные в пределах функций, относятся к этой функции. Вы должны, вероятно, выяснить остальное оттуда, если это действительно для класса.

0

Главным образом, я не понимаю, вызов г = г (е), а когда е вычисляется, он не предусмотрен аргумент, так как делает это оценить на всех? Как это знаете, что такое y? Что будет g (f) оценить?

Если посмотреть на то, как g реализуется:

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

Он принимает аргумент h, который является Function, а затем называет его как h(x). Надеюсь, это поможет вам понять, как z = g(f) заканчивает работу f.

Кроме того, насколько обзорный идет, я считаю, Javascript рассматривает наиболее все как глобальные переменные, так что последних х, устанавливаются будет значение х используется в функции F, правильно?

Неверный. Когда используется оператор var, определяется новая переменная в локальной области. В вашем случае окончательный x не является глобальным.

+0

Я ценю ваш ответ, мой вопрос, я полагаю, это то, что g (f) оценивает? Я бы предположил, что, как и последний вопрос, который я задал, он оценивает 10 + 7-2. – OogaBooga

+0

ref: http://stackoverflow.com/questions/4227972/javascript-evaluation-questions – OogaBooga

0

I также 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, 10. Из-за затенения это не эквивалентно другому коду.

Внешние x никогда не изменяются, просто затенены.

Смежные вопросы