gpt4 book ai didi

JavaScript 将函数和参数推送到数组并执行?

转载 作者:行者123 更新时间:2023-11-30 08:05:53 25 4
gpt4 key购买 nike

我正在尝试做一些类似于 Google Analytics 正在做的事情。我想将函数名和参数一起插入数组,然后执行函数名和参数。

例如:

    var _test = _test || [];
_test.push(['setName', 'Todd']);

然后在这里执行setName:

var widget = function () {

function _private_setName(a) {
console.log(a);
}

return{
setName:_private_setName
};
}();

console.log(_test);

_test 包含了函数名和参数,但是如何执行函数呢?

最佳答案

您必须遍历数组。每个内部数组的第一个元素将是方法名称,您可以将其与 bracket notation 一起使用访问对象的方法。要将剩余元素作为参数传递给该方法,请使用 .apply .

例子:

if (window._test) {
for (var i = 0; i < _test.length; i++) {
var method = _test[i].shift(); // this modifies the inner array!
widget[method].apply(widget, _test[i]);
}
}

当然你应该添加一些检查以便你尝试调用不存在的方法。

要使此“模式”真正起作用,您还必须加载脚本后正确处理对_test.push 的调用。就像现在一样,加载脚本之后添加到数组的任何元素都将被忽略。
一种解决方案是在用具有 .push 方法的对象处理现有 _test 数组后替换 _test。由于 widget 现在存在,我们可以立即执行函数调用。对于调用代码,接口(interface)没有变化。

// iterate over _test and process data 

window._test = { // overwrite _test
push: function(cmd) {
var method = cmd.shift();
widget[method].apply(widget, cmd);
}
};

如您所见,这仅在 _test 是全局的情况下才有效。我认为在 Google Analytics 中,_gaq 也必须是全局的。


这种方法的好处是您不必等到 widget 就绪。缺点可能是代码不那么清晰,只是等待脚本加载,然后进行“正常”方法调用。

那么,您什么时候使用其中一个?就我个人而言,我会选择简单地等待脚本加载完毕,例如

loadScript('scripturl', function() {
// script is ready, do stuff
});

但是,有些情况下您不能等到脚本加载完毕。例如,如果您想跟踪用户交互(Google Analytics 所做的)。如果您还想动态包含脚本,即 HTML 中没有用于它的 script 标记,则必须使用某种形式的命令队列。

关于JavaScript 将函数和参数推送到数组并执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18330867/

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