在编写复杂的 jQuery/javascript 时,如何在this
不重新定义this
之前定义的变量的情况下管理使用?您是否有经验法则或个人偏好来命名this
变量(随着嵌套变得更深)?
有时我希望更高范围的变量可用于嵌套函数/回调,但有时我希望有一个干净的石板/范围;有没有一种不用担心变量冲突的好方法来调用函数/回调?如果是这样,您使用什么技术?
一些超级愚蠢的测试代码:
$(document).ready(function() {
console.warn('start');
var $this = $(this),
$dog = $('#dog'),
billy = function() {
console.log('BILLY!', 'THIS:', $this, ' | ', 'DOG:', $dog);
var $this = $(this);
console.log('BILLY!', 'THIS:', $this, ' | ', 'DOG:', $dog);
};
// (#1)
billy(); // BILLY! THIS: undefined | DOG: jQuery(p#dog)
// BILLY! THIS: jQuery(Window /demos/this/) | DOG: jQuery(p#dog)
console.log('THIS:', $this, ' | ', 'DOG:', $dog); // THIS: jQuery(Document /demos/this/) | DOG: jQuery(p#dog)
// (#2)
billy(); // BILLY! THIS: undefined | DOG: jQuery(p#dog)
// BILLY! THIS: jQuery(Window /demos/this/) | DOG: jQuery(p#dog)
$('#foo').slideUp(function() {
// (#3)
console.log('THIS:', $this, ' | ', 'DOG:', $dog); // BILLY! THIS: undefined | DOG: jQuery(p#dog)
var $this = $(this); // (#10)
// (#4)
console.log('THIS:', $this, ' | ', 'DOG:', $dog); // BILLY! THIS: jQuery(Window /demos/this/) | DOG: jQuery(p#dog)
});
$('#clickme').click(function() {
// (#5)
console.log('THIS:', $this, ' | ', 'DOG:', $dog); // THIS: undefined | DOG: jQuery(p#dog)
var $this = $(this);
// (#6)
console.log('THIS:', $this, ' | ', 'DOG:', $dog); // THIS: jQuery(button#clickme) | DOG: jQuery(p#dog)
$('#what').animate({
opacity : 0.25,
left : '+=50',
height : 'toggle'
}, 500, function() {
// (#7)
console.log('THIS:', $this, ' | ', 'DOG:', $dog); // THIS: undefined | DOG: jQuery(p#dog)
var $this = $(this);
// (#8)
console.log('THIS:', $this, ' | ', 'DOG:', $dog); // THIS: jQuery(div#what) | DOG: jQuery(p#dog)
});
});
// (#9)
billy(); // THIS: undefined | DOG: jQuery(p#dog)
// THIS: jQuery(div#foo) | DOG: jQuery(p#dog)
console.warn('finish');
});
注意:如您所见,我已用数字(#XX)“标记”注释以方便参考。
观察1:
标记(#1)
BILLY! THIS: undefined | DOG: jQuery(p#dog)
反问:为什么$this
未定义,但$dog
可以访问?
答:因为var
那个范围内是重新定义的$this
;只是我试图$this
在该范围内定义之前记录。
如果我注释掉var $this = $(this);
,那么标记 (#1)将返回:
BILLY! THIS: jQuery(Document index2.html) | DOG: jQuery(p#dog)
BILLY! THIS: jQuery(Document index2.html) | DOG: jQuery(p#dog)
相同的逻辑适用于标记 (#2)、(#3)、(#4)、(#5)、(#6)、(#7) 和 (#8)。
基于这个观察(如果我在这里错了,请纠正我)我假设我可以放在var $this = $(this);
函数的底部,并且当前范围会知道我想使用当前范围$this
(即使它不是尚未定义),而不是父母的$this
(即使它已定义)。
$this
避免冲突的可能解决方案:
如果想要$(this)
在其他闭包/函数/回调的外部/内部缓存并避免冲突,那么应该使用不同的变量标签,例如这些(例如):
var $$ = $(this);
var $this2 = $(this);
var $t = $(this);
var $that = $(this);
问题:
上面的解决方案是如何避免$this
碰撞?如果不是,您最喜欢的技术是什么?
观察 2:
标记(#9)
THIS: undefined | DOG: jQuery(p#dog)
...$this
由于上述原因未定义,但是:
THIS: jQuery(div#foo) | DOG: jQuery(p#dog)
……$this
就是现在$('#foo')
!
问题):
究竟为什么会这样?
是因为通过标记 (#10)$this
重新定义了吗?
(嗯,我觉得我需要谷歌“javascript中的垃圾收集”。)
同样,在编写复杂的 jquery/javascript 时,避免这种类型的变量冲突的最佳方法是什么?
我希望这些不是可怕的问题。提前感谢您花时间帮助我。:)