【发布时间】:2017-01-22 15:47:36
【问题描述】:
我想包装一些动态创建的 javascript 函数,类似于 Daniel 在这里接受的答案: How do I store javascript functions in a queue for them to be executed eventually
// Function wrapping code.
// fn - reference to function.
// context - what you want "this" to be.
// params - array of parameters to pass to function.
var wrapFunction = function(fn, context, params) {
return function() {
fn.apply(context, params);
};
}
不同之处在于我希望参数值在执行时是动态的 - 是否可以在参数中传递对变量的引用,该变量可以在包装后更新?
这是我想做的:
// I have a function to be wrapped
var sayStuff = function(a,b) {
console.log(a);
console.log(b);
}
// Variables I'd like to pass
var randomNumberA = 0;
var randomNumberB = 0;
// Wrap the function
var fun = wrapFunction(sayStuff, this, [*reference randomNumberA*,*reference randomNumberB*]);
// variables get changed
randomNumberA = Math.random()*100;
randomNumberB = Math.random()*100;
// Execute the function using current values of randomNumberA & randomNumberB
fun();
如果可能的话,我想在不改变 sayStuff 的情况下这样做,我有很多像这样的现有函数我希望包装,它们也可以在包装之外使用,所以理想情况下我不想替换带有对象的参数。 希望这是有道理的,谢谢!
【问题讨论】:
-
虽然可能,但对于
this的上下文,我通常会说不,我不确定您究竟为什么要这样做? -
你应该仔细看看原语总是按值传递以及函数和方法之间的区别。当一个函数依赖于
this时,它就变成了一个方法,而你的函数都没有。 -
@Xotic750 所以我包装的函数是一堆音频过滤器。他们按顺序执行。但我想随机化它们的顺序和设置,所以我想把它们包装在一些通用的东西中。不过,他们的一些论点需要是动态的。我希望将每个对象包装在一个对象中,以便该对象成为我认为的上下文
-
使用你自己的对象作为上下文应该没问题。
标签: javascript function dynamic arguments wrapper