javascript - Chrome 浏览器忽略 var self = this;

标签 javascript google-chrome this undefined self

我正在编写一些 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/

相关文章:

javascript - JQuery - $ ('#test ul > li' ).index(2).hide(); - 可能的?

javascript - 为什么我的 !important 样式属性在 Chrome 中被覆盖?

javascript - 如何修复错误 "Selection.addRange()"?

javascript - 为什么 'this' 在方法中结果为 'Undefined' [javascript]

javascript - forEach 和 addEventListener 方法中 "this"的行为

javascript - 如何缩短这个函数(addClass,attr)

javascript - 在 Chrome 扩展中绕过 X-Frame-Options DENY?

javascript - 条件重定向问题

c# - 无法在 Chrome v76 中隐藏 "Chrome is being controlled by automated software"信息栏

javascript - 使用 forEach() 时如何将参数 'this' 绑定(bind)到数组的每个元素?