如果我需要编写一个带有参数的java脚本函数并返回一个返回该参数的函数,我可以考虑以下两个实现。两者都是一样的吗?或者技术上有什么不同?两者都起作用并返回相同的结果。
/*Implemenation 1*/
function myWieredFunc(arg){
var retf=function inner(){
return arg;
};
return retf;
}
/* Implemenation 2 */
function myWieredFunc(arg){
return function(){
return arg;
};
}
使用这些:
var f = myWieredFunc(84);
alert(f());
答案 0 :(得分:1)
这就是写它的方式
function wrap(arg) {
return function() {
return arg;
};
};
如果你想让它更灵活,你可以允许多个参数:
function wrap() {
var args = arguments;
return function() {
return args;
};
};
var later = wrap('hello', 'world');
var result = later();
console.log(result); // ["hello", "world"]
答案 1 :(得分:0)
它们是相同的,第二个是使用“匿名”函数,这意味着它的函数没有给出名称或赋值给变量。
答案 2 :(得分:0)
在显示的代码中没有理由变量 - 函数是对象是值。如您所示,这意味着可以将函数对象分配给稍后评估和返回的变量,或者直接从函数表达式返回。
因此,两种形式通常都是等价的,arg
以上的封闭不受影响。
然而,在第一种形式..
Function.toString
和堆栈跟踪通常包含函数名称,这使得“命名函数”,如第一个示例中有时在调试中更有用。此外,Firefox将公开函数名称 - 例如“内部” - 通过非标准 Function.name
属性。 (可以在不使用retf
变量的情况下指定函数名称。)
引入了两个额外的绑定 - 外部函数中的retf
和内部函数中的inner
。当通过断点停止时,可以在适用的范围内观察到这些变量 ,但在显示的代码中无法访问这些变量