如何调用存储在jQuery数组中的函数?

时间:2011-08-09 14:07:28

标签: javascript jquery hook

我在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); });

修改 事实证明问题出在代码的其他地方。但是,我仍然想知道如何最好地实现这一目标。

4 个答案:

答案 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) { ... } } }
)

因为每次执行代码时都会将函数推入自身。我不确定为什么你需要再次poppush,但这看起来很奇怪。

此外,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.