我们试图理解JavaScript匿名函数中的变量作用域。
此代码只需要在Webkit浏览器中工作,因为它适用于PhoneGap应用程序。
考虑到下面的代码块, all_packs 中每个项目的 setTimeout 的参数总是相同,或者 pack_name的值是否更改(因为它在jQuery循环的每次迭代中都会发生变化)会影响参数吗?换句话说,每个新行应与 all_packs 中的其他项目相关联。这是使用匿名函数的正确方法,还是某些行最终会引用相同的名称?
我们无法在点击匿名函数中使用 this.name ,因为此将不再引用中的项目all_packs 即可。因此,我们首先将名称隐藏在 pack_name 。
中假设 TAP_DELAY 是在其他地方设置的常量, start_work 是有效的函数,而 all_packs 是一个对象数组。
// Load each pack
$( all_packs ).each( function(index) {
// Set vars
var pack_name = this.name;
var row = $( '#templates .row' ).clone( true );
// Append new row
$( '#test' ).append( row );
// Valid pack?
if ( this.valid ) {
// Configure for tap
row.on( 'tap', function() {
setTimeout( start_work, TAP_DELAY, pack_name );
});
} else {
setTimeout( start_work, TAP_DELAY, this.name );
}
});