gpt4 book ai didi

javascript - 如何使用动态参数包装 JavaScript 函数?

转载 作者:行者123 更新时间:2023-12-02 14:11:42 26 4
gpt4 key购买 nike

我想包装一些动态创建的 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 的情况下执行此操作,我希望包装很多这样的现有函数,它们也会在包装之外使用,所以理想情况下我不想替换带有对象的参数。希望这是有道理的,谢谢!

最佳答案

如果函数和变量将在同一范围内创建,您可以使用它:

var randomNumber = 0;
var fun = function(){ alert(randomNumber); }

randomNumber = 10;

// Now this will alert 10, because when fun is executed
// JS looks in his scope to find what randomNumber is.
fun();

发生这种情况是因为 javascript 中的函数作为闭包工作,它们携带着它们的环境。请参阅:https://en.wikipedia.org/wiki/Closure_(computer_programming)

因此,如果 randomNumber 将更改为超出您绑定(bind)该函数的范围,则需要使用一个对象,这是因为在 javascript 中我们没有“指针”或要传递的引用经过。一种方法是使用对象。

function giveMeAFunction(){
var params = { randomNumber: 0 }
var fun = function(){ alert(scope.randomNumber); }
return {fun: fun, scope: scope};
}

var paramsAndFun = giveMeAFunction()
// Now you can change the variables in the scope and call the function
paramsAndFun.params.randomNumber = 10;
paramsAndFun.fun(); // Will alert 10

// Now if you replace the entire params object it will not work
// This is because you will replacing it with a new object while
// The one that is referenced in the scope where fun was created is
// the old one.
paramsAndFun.params = { randomNumber: 15 };
paramsAndFun.fun(); // will still alert 10

现在让我们来解决问题的一部分。

已经有 Function.prototype.bind函数可以帮助您。

例如:

var sayStuff = function(opts) {
alert(otions.randomNumber);
}

var options = { randomNumber: 0 };
var fun = sayStuff.bind(this, options);

options.randomNumber = 10;

fun(); // Will print 10

这里发生了很多事情。抱歉,如果我让一切变得困惑。

关于javascript - 如何使用动态参数包装 JavaScript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39497186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com