Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是JavaScript的正确形式吗?_Javascript - Fatal编程技术网

这是JavaScript的正确形式吗?

这是JavaScript的正确形式吗?,javascript,Javascript,下面的脚本是否为正确的JavaScript格式 function foo(){ return function(x){ alert(x) } } foo()("bar"); ↑ ↑ There are 2 parenthesis. 但我不知道它的形式是否正确。 如果是,那么这是否意味着这也是正确的 function foo(){ return function(){ return function(){

下面的脚本是否为正确的JavaScript格式

function foo(){
    return function(x){
        alert(x)
    }
}
foo()("bar");
    ↑   ↑
   There are 2 parenthesis.
但我不知道它的形式是否正确。
如果是,那么这是否意味着这也是正确的

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

对我来说这看起来很奇怪,但它确实有效…

是的,这是有效的语法。它在风格上没有什么问题,只是新的程序员可能会觉得它有点混乱。重复的
()
表示前面的表达式正在作为函数调用。如果这样写,您的第一个示例可能会更清楚一些:

( foo() )("bar");
最后一个例子是:

( ( ( ( foo() )() )() )() )("?!?!?!");

这将是调用这些构造的正确方法。更好的问题是为什么。。。你可以做你发布的事情,但我发现很难证明嵌套函数的合理性5次。

Javascript中的函数是“一阶”对象,这意味着它们可以像任何其他对象一样被创建和传递。因此,是的,您可以从另一个函数返回它们,并完全按照您提到的操作:

var f = g();
f();

// The same as
g()();

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

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); 
因为precG是在括号中声明的,所以它的值是由阶乘函数在内部计算的,不能被混淆

分配给变量的函数称为正常函数:-

factorial(3);

如果它像预期的那样工作,那么我看不到任何问题,除了它看起来很难看可能这只是一个简化的例子,或者用户正在尝试学习。我曾经遇到过一些实际案例,其中函数返回两个级别的函数(
foo()()
)实际上很有用。我同意这是有效的语法,但不同意没有“风格上的错误”。这是一种不好的风格,因为它很难阅读,也不容易理解,所以维护和错误修复将比它应该的更困难,因为没有实际的好处。@RobG:类似的结构,如
(function(){…})()始终用于在包含的脚本中创建私有作用域。这不仅在风格上没有错误,在某些情况下也鼓励这样做。使用立即调用的函数ePxPression与链接调用略有不同。即使对于iife,外括号也不是必需的,但是作为“好的样式”包括在内,因为它们让你从一开始就知道你在读什么。i、 例如,
(function(){…}())
function(){…}()
更清晰,尤其是当函数有许多行代码时。@Derek-您需要先定义g,例如
function g(){return function(){}
。ps上面的函数名f是可选的,也就是说,可以调用var阶乘,因为赋值发生在函数求值之前。