Is it good to make function in function using 'return
Is it good to make function in function using 'return'?
当我研究函数时,我意识到我可以创建嵌入式函数。首先,我认为它可能对构建代码有用。但现在我认为这不是一种好的编码风格。我说得对吗?下面是一个例子。
function show () {
return function a() {
alert('a');
return function b() {
alert('b');
}
}
}
我可以使用以下字符串调用alert('b')
:show()()
;
在什么情况下最好使用此方法,在什么情况下不使用此方法?
是的,这有很多用途。
Currying
首先,您可能想要使用currying,将一个具有单个参数的函数封装为一个具有多个参数的函数。例如,
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和其他一些语言中最常见的编码风格之一,它们将函数视为第一类公民。这些嵌套声明的最大用途之一是创建闭包和currying。
- 直接在函数声明上使用function.prototype.bind
- jQuery:.click(function(){(element),collapse('show',f
- 如果连接类型为none,则Javascript Function Only警报
- jquery if语句返回return wong语句
- 函数在return语句之前返回空对象
- Javascript Return and if/else
- 在ES6 Promise中,我应该在解决/拒绝之前使用return吗
- onLoad function phonegap android
- 为什么我需要写“;function(value){return my_function(value);作为node.js
- KnockoutJS:无法处理绑定"if:function(){return conversations}”;
- Is it good to make function in function using 'return
- Asp .NET Button - OnClientClick="return function()"
- (new Array(10)).map(function() { return 1;}) 返回 [, , , , , .
- .then(Promise.mapSeries(..))的行为是否与.then(function(){return Pr
- 撤消单击(function(){return false;})
- d3中恒等函数(“function(d){return d;}”)的简写是什么
- Promises .then(async()) versus .then(function(){return async
- 如何修复“;return not in function”;firebug上显示的错误
- Selenium Exception : "return not in a function"
- 这个Javascript做什么`new Function(“_”,“at”,“with(_){return(“+text