我正在编写一些 jQuery javascript 代码并调试 Google Chrome 中的一个问题(Mac OS X 10.7 Lion 上的最新稳定版 24)时我发现了
MyWidget = Widget.extend({
_item_id : undefined,
container : undefined,
initialize : function(config) {
var self = this;
self.container = $(config.container_id);
self._item_id = config.item_id;
if (typeof(config.changeElement) !== 'undefined') {
self._changeElement = config.changeElement;
$(self._changeElement).unbind('change', OtherWidget.has_setting_changed);
$(self._changeElement).change(function (event) {
self.changeSetting($(event.target).val()); // had 'this' here before
});
self._load();
}
},
_load : function() {
var self = this; // <-- here is what fails
self.changeState('Loading');
if (typeof(self._item_id) === 'undefined' || this._item_id === '') {
self.changeState('Create');
} else {
self._loadItem();
}
},
changeSetting : function(item_id) {
this._item_id = item_id;
this._load();
this._reloadOtherWidget();
},
...
});
在调试器中显示:“self: undefined”。赋值是在成员函数内部,如果这有什么不同的话。我最终直接使用了“this”,因为它是简单的代码。我知道我正在破坏(“隐藏”)某种对窗口的内置引用,但我认为它会起作用...我正在处理一个已知问题吗?
我看到这篇相关的帖子似乎表明它会起作用: that, self or me — which one to prefer in JavaScript?
最佳答案
在你放的地方
var self = this; // <-- here is what fails
已经太晚了:你在你调用的函数中。
你可以这样做:
MyWidget = Widget.extend((function(){
var self = {
_item_id : undefined,
container : undefined
};
self.initialize = function(config) {
self.container = $(config.container_id);
self._item_id = config.item_id;
if (typeof(config.changeElement) !== 'undefined') {
self._changeElement = config.changeElement;
self._load();
}
};
self._load = function() {
self.changeState('Loading');
if (typeof(self._item_id) === 'undefined' || this._item_id === '') {
self.changeState('Create');
} else {
self._loadItem();
}
};
return self;
})());
关于javascript - Chrome 浏览器忽略 var self = this;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14482067/