用function.apply传递一个闭包

时间:2015-01-24 11:08:07

标签: javascript

考虑带参数的函数:

function add1(a, b) { return a + b; }

我们可以使用例如add1来调用add1.apply(window, [1, 2])并获取结果3


使用this来考虑函数:

function add2() { return this.a + this.b; }

我们可以使用add2致电add2.apply({a: 1, b: 2}, null)并获取结果3


考虑一个(不太好)的功能:

function add3() { return a + b; }

我们有什么办法可以调用此函数并传递包含ab值的闭包吗?

请注意,在全局范围内创建ab不是可接受的解决方案(例如window.a=1; window.b=2; add3();

2 个答案:

答案 0 :(得分:1)

我认为将参数声明为a和b的想法是将这些变量设置在函数体中。所以你不需要做

function add_ab() { 
  var a = arguments[0]; 
  var b = arguments[1];  
  return a + b; 
}

或以Perl风格完成:

function add_ab() { 
  var args = Array.slice(arguments); 
  var a = args.shift(); 
  var b = args.shift(); 
  return a + b; 
}

通常,如果您不知道参数的数量,您只需传递一个类型为array的参数,这样就可以在数组中添加所有数字。

答案 1 :(得分:1)

来吧,伙计们。 Javascript是一种动态语言,所以几乎任何事情都是可能的:

function add3() { return a + b; }

(function notGlobalScope() {
    var a = 1;
    var b = 2;
    var funcBody = "var a="+ a +", b="+ b +";\n"+
        add3.toString() +"\n"+
        "add3()";
    console.log(eval(funcBody));
})()