Javascript函数实现变化

时间:2014-02-08 23:37:14

标签: javascript function

如果我需要编写一个带有参数的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());

3 个答案:

答案 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以上的封闭不​​受影响。

然而,在第一种形式..

  1. Function.toString和堆栈跟踪通常包含函数名称,这使得“命名函数”,如第一个示例中有时在调试中更有用。此外,Firefox将公开函数名称 - 例如“内部” - 通过非标准 Function.name属性。 (可以在不使用retf变量的情况下指定函数名称。)

  2. 引入了两个额外的绑定 - 外部函数中的retf和内部函数中的inner。当通过断点停止时,可以在适用的范围内观察到这些变量 ,但在显示的代码中无法访问这些变量