我有一个js对象
var myClass = Class.extend({
_innerArr: [],
add: function( id, url ){
this._innerArr.push([id, url]);
},
delete: function( id ){
$( this._innerArr ).each(function( index ){
if ( $( this )[0]==id ){
this._innerArr.splice( index, 1); // Doesn't work!!! Uncaught TypeError: Cannot call method 'splice' of undefined
}
});
}
});
但是,如果代码改变了:
var globalArr;
var myClass = Class.extend({
_innerArr: [],
add: function( id, url ){
this._innerArr.push([id, url]);
},
delete: function( id ){
globalArr = this._innerArr;
$( this._innerArr ).each(function( index ){
if ( $( this )[0]==id ){
globalArr.splice( index, 1); // Work!!!
}
});
}
});
为什么this._innerArr不起作用?我不想在我的项目中使用添加变量。想想,其他方式是......
答案 0 :(得分:3)
使用jQuery的.each()
方法时,函数将以this
作为数组的当前值进行调用。您在执行$( this )[0]
时正在使用它。 ($( this )[0]
可能是不必要的。)
您不需要为此创建全局变量,但您也可以在delete
函数中设置范围变量。
或者,您可以使用for
循环而不是jQuery的each()
。那也快一点。
答案 1 :(得分:0)
发生这种情况的原因是因为this
回调内部.each()
的范围发生了变化;这是众所周知的现象,通常涉及将this
保存在函数调用之外的另一个变量中。
您可以使用jQuery.grep()
:
this._innerArr = $.grep(this._innerArr, function(element) {
return element[0] != id;
});