我在jQuery中有一个钩子数组,在我将数据加载到网格之前执行。但是,在一种情况下,我想删除钩子,然后将其添加回来以供日后使用。无论我正在做什么都没有正常工作...这可能是一个语法错误,因为我仍然有点新的jQuery。任何帮助将不胜感激,谢谢!
当前代码:
var preLoad = this.opts.hooks.preLoad.pop();
//stuff happens
//now I want to add the preLoad hook back
this.opts.hooks.preLoad.push(function(report) { preLoad(report); });
修改 事实证明问题出在代码的其他地方。但是,我仍然想知道如何最好地实现这一目标。
答案 0 :(得分:4)
您可以像存储在任何其他数组中的任何其他变量一样访问它。
this.opts.hooks.preLoad[0](myReport)
答案 1 :(得分:2)
你能不能像这样添加你删除的功能?
var preLoad = this.opts.hooks.preLoad.pop();
//stuff happens
//now I want to add the preLoad hook back
this.opts.hooks.preLoad.push(preLoad);
你确定它总是你要删除的数组中的最后一个吗?
答案 2 :(得分:2)
当你将函数推回到堆栈上时,它可能与你正在“封装”参数“report”这一事实有关。
尝试这样做:
var preLoad = this.opts.hooks.preLoad.pop();
//stuff happens
//now I want to add the preLoad hook back
this.opts.hooks.preLoad.push(preLoad);
我在这里测试了http://jsfiddle.net/fWRez/
答案 3 :(得分:1)
您提供的示例与jQuery无关,而且是纯Javascript。另外,请注意您在示例中所做的是......不对。考虑一下:
var ReportManager {
...
replace: function(report) {
var preLoad = this.opts.hooks.preLoad.pop();
//stuff happens
//now I want to add the preLoad hook back
this.opts.hooks.preLoad.push(function(report) { preLoad(report); });
}
}
如果执行此操作:
replace(null);
replace({foo:'bar'});
replace(null);
您的this.opts.hooks.preLoad
数组将如下所示:
Array(
0: function(report) { return function(report) { return function(report) { ... } } }
)
因为每次执行代码时都会将函数推入自身。我不确定为什么你需要再次pop
和push
,但这看起来很奇怪。
此外,Javascript是一种非常灵活的语言;这意味着你可以做很多奇怪的事情,比如
"hello".concat(" world"); // -> 'hello world'
0.toString(); // -> '0'
(function(a) { return a; })("foo"); // -> 'foo'
(function() { return false; })() || (function() { return true; })(); // -> true (executes both functions)
(function(i) { return [i*2,i*3,i*4]; })(2)[1]; // -> 6
$('selector')[0]; // ...
// etc.