Javascript 使用'在函数中生成函数是否好;返回';?

Javascript 使用'在函数中生成函数是否好;返回';?,javascript,function,Javascript,Function,当我研究函数时,我意识到我可以创建嵌入式函数。首先,我认为它可能有助于构建代码。但现在我认为这不是一种好的编码风格。我说得对吗?这里有一个例子 function show () { return function a() { alert('a'); return function b() { alert('b'); } } } 我可以使用以下字符串调用alert('b'):show()() 在什么情况下使用

当我研究函数时,我意识到我可以创建嵌入式函数。首先,我认为它可能有助于构建代码。但现在我认为这不是一种好的编码风格。我说得对吗?这里有一个例子

function show () {
    return function a() {
        alert('a');
        return function b() {
            alert('b');
        }
    }
}
我可以使用以下字符串调用
alert('b')
show()()


在什么情况下使用此方法更好,在什么情况下不使用此方法更好?

这是Javascript和一些其他语言中最常见的编码样式之一,这些语言将其函数视为头等公民。这些嵌套声明的最大用途之一是创建闭包和进行转换。

是的,这有很多用途

咖喱 首先,您可能想使用,在这里,您可以用一个具有多个参数的函数封装一个具有单个参数的函数。比如说,

function getHandler(num){
 return function(){
  alert(num);
 }
}

myElement.onclick=getHandler(1)
myOtherElement.onclick=getHandler(25)
anotherElement.onclick=getHandler(42)
无法为系统调用的
onclick()
指定任意参数。这不是编写3个不同的处理程序来警告不同的数字,而是通过创建一个可以生成“警告数字”类型的任意处理程序的函数来减少膨胀。当然,这是一个相当简单的例子,但是如果你必须做比
alert()
更复杂的事情,那么咖喱的好处是显而易见的

效率 另一种情况是,当你有一个复杂的函数,它有一个计算量大的部分,后面跟着一个计算量小的部分。这两部分采用不同的参数,通常第一部分的参数相同。可以使用的某些变体来解决此问题,但作为返回值的函数也起作用

例如,假设您具有以下形式的函数:

function doSomething(a,b,c,x,y){
//Do some complicated calculations using a,b,c, the results go to variables e,f,g

//Do some simple calculations using e,f,g,x,y, return result
}
如果我想运行
doSomething(1,2,3,18,34)+doSomething(1,2,3,55,35)+doSomething(1,2,3,19,12)
,每次执行长部分需要3倍的执行时间

但是,我们可以这样写:

function doSomethingCreator(a,b,c){
//Do some complicated calculations using a,b,c, the results go to variables e,f,g
 return function(x,y){
  //Do some simple calculations using e,f,g,x,y, return result
 }
}
现在,我需要做的就是为我的参数集调用
doSomethingCreator()
,并使用创建的函数(它很快)来获得最终结果。代码变为:

var doSomething123=doSomethingCreator(1,2,3);
console.log(doSomething123(18,34)+doSomething123(55,35)+doSomething123(19,12))
其中一个例子是求解微分方程。如果给出了一些“边界条件”,微分方程就没有单一的解。然而,(特别是对于齐次方程),在一点之后,很容易改变边界条件并获得解。对于不同的边界条件,通常需要多次求解同一个方程。所以,如果你想写一个库方法,你会让它把齐次方程作为输入,它会返回一个函数,而这个函数又可以被赋予边界条件作为输入,从而得到最终的解

通过闭包的“静态”变量 有时,您希望能够轻松地创建一组变量,并将它们随身携带

例如,如果要创建计数器函数:

function generateCounter(){
var c=0;
return function(){
        c++; 
        return c;
       }
}
我们可以用它来制作许多独立的计数器,例如:

myCtr1=generateCounter();
myCtr2=generateCounter();

myCtr1(); //Returns 1
myCtr1(); //Returns 2
myCtr2(); //Returns 1
myCtr1(); //Returns 3
myCtr2(); //Returns 2
每个计数器都是独立的。当然,在这种情况下,更容易使用
myCtr1=0;myCtr2=0
然后是
++
运算符,但是如果要记录它们递增的时间,该怎么办?扩展
++
案例将涉及大量代码重复,但是,这里我们可以非常轻松地调整它:

function generateCounter(){
var c=[]; // The length of c is the value of the counter
return function(){
        c.push((new Date()).getTime()); 
        return c;
       }
}
当你不应该使用它的时候 只要这样做没有明显的好处


除了要将其用于闭包绑定的变量外,当内部函数变为同一个函数时,使用外部函数的0个参数通常没有多大意义。看看它是否真的改进了程序,然后使用它。

现实世界中有很多应用程序都是这样做的,而且经常这样做。这是JavaScript的主要功能之一,许多模式都依赖于它,所以不,它本身没有什么问题。