传递带有 function.apply 的闭包
Pass a closure with function.apply
考虑一个带有参数的函数:
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; }
有什么方法可以调用这个函数并传递一个包含 a
和 b
值的闭包?
请注意,在全局范围内创建a
和b
是不可接受的解决方案(例如 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 类型的参数,以便将数组内的所有数字相加。
相关文章:
- 在underscorejs模板中使用闭包
- setTimeout可以与闭包内的函数一起使用吗
- 附加到原型属性的Do函数没有闭包
- 使用闭包共享构造函数参数
- 使用Google闭包编译器包含一个Ecmascript 6类
- 从js引擎的角度来看闭包和构造函数是如何工作的
- for循环中的JavaScript闭包
- Javascript闭包-如何防止内存泄漏
- 子类访问父类's闭包变量
- 闭包如何具体化数据封装
- Javascript.闭包和dynamic'这'实际上具有约束力
- 构造函数函数闭包变量
- 闭包js框架-将ArrayBuffer转换为字符串
- 如何在Angularjs中重构闭包中的重复代码
- 如何告诉闭包javascript编译器不要混淆webkitAudioContext的方法名称
- Google闭包和生成的getters/ssetter
- 如何冻结函数's在闭包中的变量
- 如何使用外部Javascript库(如jQuery)重命名Google闭包样式表
- 传递带有 function.apply 的闭包
- 如何使用闭包的apply/call通过嵌套对象传递变量