2013-08-07 2 views
-2

Как мне вернуть это значение для x + y + z вместо ошибки?функции возвращают функции, возвращающие функции javascript

function A (x) { 
    return function B (y) { 
     return function(z) { 
      return x+y+z; 
     } 
    } 
}; 

var outer = new A(4); 
var inner = new outer(B(9)); 
inner(4); 
+0

Код работает нормально. Чего вы хотите достичь? Неясно, что вы спрашиваете. –

+1

Здесь нет «нового», вы можете назвать его как «A (2) (3) (4)» или «var f = A (2); var g = f (3); alert (g (4)); ', почти то же самое ... – yent

+0

yent..Thanks для отличного ответа. Пожалуйста, сделайте это ответом. Джефф ... Нет, он не работает, вы попробовали? «B в неопределенной». избавиться от его возвращения х + у + г. просто доказательство концепции. – mike628

ответ

2

Как сказал yent, никаких «новых» не требуется. «new» возвращает экземпляр.

Например (каламбур):

function foo(a){ 
    return a; 
} 

foo(4); // this will return 4, but 
new foo(); // this will return a 'foo' object 

Но теперь на ваш вопрос. Как сказал rid, B объявлен в рамках функции A. Итак, ваш new outer(B(9)); выдает ошибку, потому что B не существует в пределах области, где вы ее назвали.

Во-вторых, вернемся к тому, что сказал yent. Поскольку каждая функция возвращает функцию, мы вызываем возвращаемое.

function A (x) { 
    return function B (y) { 
     return function C (z) { 
      return x+y+z; 
     } 
    } 
}; 

var f = A(2); // f is now function B, with x = 2 
var g = f(3); // g is now function C, with x = 2, and y = 3 
var h = g(4); // Function C returns x+y+z, so h = 2 + 3 + 4 = 9 

Однако, мы можем использовать следующий 'ярлык':

A(2)(3)(4); 
// each recursive '(x)' is attempting to call the value in front of it as if it was a function (and in this case they are). 

Для рода объяснения:

A(2)(3)(4) = (A(2)(3))(4) = ((A(2))(3))(4); 

// A(2) returns a function that we assigned to f, so 
((A(2))(3))(4) = ((f)(3))(4) = (f(3))(4); 

// We also know that f(3) returns a function that we assigned to g, so 
(f(3))(4) = g(4); 

Я надеюсь, что помог!

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