2011-08-08 48 views
3

在JavaScript中的正确形式下面的脚本?这是JavaScript的正确形式吗?

function foo(){ 
    return function(x){ 
     alert(x) 
    } 
} 
foo()("bar"); 
    ↑ ↑ 
    There are 2 parenthesis. 

works,但我不知道这是否是一个正确的形式。
如果是,则意味着这也是正确的吗?

function foo(){ 
    return function(){ 
     return function(){ 
      return function(){ 
       return function(x){ 
        alert(x) 
       } 
      } 
     } 
    } 
} 
foo()()()()("?!?!?!"); 

它看起来很奇怪,我,但它的工作...

+2

如果它能正常工作,然后我看不出任何问题,其他比它看起来丑陋 – Phil

回答

1

的函数调用顺序是通过添加参数显示: -

function foo(a){ 
    var A=a; 
    return function(a){ 
     A+=a; 
     return function(a){ 
      A+=a; 
      return function(a){ 
       A+=a; 
       return function(a){ 
        A+=a; 
        alert(A) 
       } 
      } 
     } 
    } 
}; 
foo('a')('b')('c')('d')('e');// displays abcde 

你可以把函数的返回本身,因此它可以被反复调用,如

var foo = (function(){ 
    var v=1; 
    return function f(x){ 
     return x==undefined?v: (v*=x, f); 
    } 
})(); 
foo.toString=function(){ 
return foo(); 
}; 
alert(foo(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)); 

嵌套通常是保持私有变量,如

var factorial=(function(n){ 
    var precog = [1,1]; 
    var factorial= function f(y){ 
     if(precog[y]==undefined){ 
      precog[y]=y*f(y-1); 
     } 
     return precog[y]; 
    }; 
    factorial(n);// initialise some precogs 
    return factorial; 
})(100); 

由于precog在括号其值,通过阶乘函数内部计算,不能与弄乱约声明。

赋给变量的函数被调用为正常: -

factorial(3); 
+0

ps上面的函数名f是可选的,即可以调用var factorial因为赋值在函数求值之前发生。 – QuentinUK

2

是的,这是有效的语法。它没有任何风格上的错误,除了新的编码器可能会觉得有点混乱。重复的()表示前面的表达式被调用为函数。如果这样写你的第一个例子可能更清楚一点:

(foo())("bar"); 

你的最后一个例子是有效:

((((foo())())())())("?!?!?!"); 
+2

同意它是有效的语法,但不同意有没有“风格错误”。这是一种糟糕的风格,因为它很难阅读并且不易理解,所以维护和缺陷修复会比实际上没有的应用更困难。 – RobG

+1

@RobG:类似的构建,比如'(函数(){...})();'使用所有的时间来创建包括脚本私人范围。它不仅在风格上不是错误的,在某些情况下会受到鼓励。 – cdhowie

+1

使用立即调用的函数epxression与链接调用有点不同。即使对于IIFE,外括号也不是必需的,但被列为“优秀风格”,因为它们从一开始就让您知道您正在阅读的内容。即'(函数(){...}())'比'函数更清晰(){...}()',particluarly其中函数具有多行代码。 – RobG

2

这将是调用这些结构的正确途径。更好的问题是为什么......你可以做你已经发布的内容,但是我很难判定嵌套函数5次。在Javascript

+1

大概这只是一个简单的例子,或者用户正在尝试学习。我有真实世界的情况下,函数返回两个级别的函数('foo()()()')实际上是有用的。 – cdhowie

1

函数是“一阶”对象,这意味着它们可以被创建并传递周围像任何其他对象。所以,是的,你可以从另一个函数返回他们,你提什么:

var f = g(); 
f(); 

// The same as 
g()(); 
+0

它给我一个错误... –

+0

@Derek - 您需要先定义* g *,例如'函数g(){return function(){}}'。 – RobG