den*_*mat 2 javascript jquery function-pointers
JQuery版本
jQuery JavaScript Library v1.4.4
问题
解决方案可能是显而易见的,但我正在摸不着头脑.
问题是在进行一些代码优化时,我遇到了一个循环,它调用了几次jquery元素,这是一个相当大的循环.所以它看起来像这样:
var list_of_goodies = [1,2,3,...];
$.each(list_of_goodies, function(val) {
$('div.toaddto').append(val);
...some more code...
$('div.toaddto').append(otherval);
});
Run Code Online (Sandbox Code Playgroud)
你可以看到没有真正优化,所以我尝试使用函数指针,所以它看起来像这样:
var list_of_goodies = [1,2,3,...];
var toaddtoAppend = $('div.toaddto').append;
$.each(list_of_goodies, function(val) {
... the other code...
toaddtoAppend(val).append(otherval);
});
Run Code Online (Sandbox Code Playgroud)
它可能看起来不是一个巨大的优化,但它是一个很大的列表,这可以节省大量的查找时间,尤其是在较旧的IE中.然而,这会导致错误.
错误
this.domManip不是一个函数
不幸的是,这是来自缩小的jQuery,所以没有更多的信息,它似乎发生在wrapInner()中.
题
这是范围问题还是参考问题?我没有使用jQuery测试它,函数指针工作.
$ .each或for循环以相同的结果结束.谁知道我在哪里错了?我对javascript如何处理函数指针知之甚少,特别是当它们应该与某个实例相关联而不仅仅是静态时,所以请原谅任何无知.
浏览器测试
无论浏览器的结果总是相同的,这似乎表明它不是浏览器如何处理导致它破坏的指针.
自己测试一下
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
var iterables = [];
for (var i = 0; i < 1000; i++) iterables.push(i);
var divAppend = $('#test').append;
$.each(iterables, function(val) {
divAppend(val);
});
});
</script>
</head>
<body>
<div id="test"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
谢谢,dennmat
在编写时var divAppend = $('#test').append,您将存储对jQuery标准append函数的引用.
它等同于写作var divAppend = $.fn.append- $('#test')不存储在任何地方.
当你调用divAppend的正常功能,它this就是window,不是一个jQuery对象.
您需要存储一个显式调用的函数$('#test').append(...),或者用于divAppend.call($('#test'), val)显式调用append正确的对象.
| 归档时间: |
|
| 查看次数: |
2079 次 |
| 最近记录: |