启动你的firebug控制台并试一试.
比较一下:
$('body').data('x',1);
$(thisx).remove();
console.log($('body').data('x'));
Run Code Online (Sandbox Code Playgroud)
对此:
$('body').data('x',1);
$(this.x).remove();
console.log($('body').data('x'));
Run Code Online (Sandbox Code Playgroud)
请注意区别?如果thisx未定义,它将立即抛出引用错误.如果x是未定义的属性this,jQuery将返回文档,因为它的结果集.接下来jQuery将尝试删除您的文档(它不能),但在此之前它将删除附加到文档的任何子元素的所有数据.因此,擦除您的数据存储.
注意:this可以是任何元素引用或对象.您只需要让jQuery尝试访问未定义的属性.
(谈论一个痛苦.它无声地失败,我正在试图找出为什么我的数据突然丢失.我追踪到一个特殊情况,在特定情况下元素引用未定义.)
关于我的问题:
1)在我提交错误报告之前,我是否正确分析了这个问题?如果有人碰巧知道这是一个已知问题,请告诉我.我在bug跟踪器中找不到它,但界面不是很好(或者我错了).
2)为什么最终会有任何差异?我猜thisx是立即评估导致异常,this.x而是在被调用函数中传递和计算的引用,对吧?(我认为这条线selector = selector || document;是罪魁祸首.
3)如何处理这个问题的建议?我想我应该检查对象的任何/每个元素引用或属性(例如存储的选择器字符串)是否在我删除之前将其传递给jQuery之前定义.
为什么最终会有差异?
当函数被调用时,和thisx都会被求值。this.x第一个引用未定义的变量名,这会引发引用错误。第二个访问对象的未定义属性,这会产生值undefined。这就是 javascript 在这些情况下的行为方式。
现在,当在第二种情况下调用 JQuery 时,调用的$(this.x)计算结果与$(undefined)您刚才调用的相同$()。由于 JQuery 看起来好像没有提供参数,因此它使用默认值,在本例中默认值是document. 然后它继续尝试删除document,因为它实际上被称为 $().remove(),在这种情况下这是预期的。
关于如何处理这个问题的建议?
与 的区别ReferenceError是 Javascript 的根本区别,对此我们无能为力。JQuerys 的行为是不幸的,并且是由arg = arg||default. 人们可以arguments.length改为获取调用参数的实际数量,但是这样的更改肯定会导致大量依赖于传递undefined或时使用的默认值的损坏代码0,因此不太可能发生。
| 归档时间: |
|
| 查看次数: |
362 次 |
| 最近记录: |