传递带有 function.apply 的闭包

Pass a closure with function.apply

本文关键字:apply 闭包 function      更新时间:2023-09-26

考虑一个带有参数的函数:

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

例如,我们可以调用add1 add1.apply(window, [1, 2]) 并得到结果3


考虑一个使用 this 的函数:

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

我们可以使用 add2.apply({a: 1, b: 2}, null) 调用add2并得到结果3


考虑一个(不太好)函数:

function add3() { return a + b; }

有什么方法可以调用这个函数并传递一个包含 ab 值的闭包?

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

来吧,你们。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));
})()
我认为将

参数声明为 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 类型的参数,以便将数组内的所有数字相加。