这是JavaScript的正确形式吗?
下面的脚本是否为正确的JavaScript格式这是JavaScript的正确形式吗?,javascript,Javascript,下面的脚本是否为正确的JavaScript格式 function foo(){ return function(x){ alert(x) } } foo()("bar"); ↑ ↑ There are 2 parenthesis. 但我不知道它的形式是否正确。 如果是,那么这是否意味着这也是正确的 function foo(){ return function(){ return function(){
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阶乘,因为赋值发生在函数求值之前。