Как сказал 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);
Я надеюсь, что помог!
Код работает нормально. Чего вы хотите достичь? Неясно, что вы спрашиваете. –
Здесь нет «нового», вы можете назвать его как «A (2) (3) (4)» или «var f = A (2); var g = f (3); alert (g (4)); ', почти то же самое ... – yent
yent..Thanks для отличного ответа. Пожалуйста, сделайте это ответом. Джефф ... Нет, он не работает, вы попробовали? «B в неопределенной». избавиться от его возвращения х + у + г. просто доказательство концепции. – mike628