- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试做一些类似于 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/
我是一名优秀的程序员,十分优秀!