1

私はいくつかのjQueryjavascriptコードを書いていて、それを見つけたときに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();
        },
...
});

デバッガーに表示された:「自己:未定義」。それが何か違いを生むのであれば、割り当てはメンバー関数内にありました。単純なコードだったので、「this」を直接使用することになりました。ある種の組み込みのウ​​ィンドウへの参照を覆い隠している(「シャドウイング」している)ことは知っていますが、それでうまくいくと思いました...既知の問題に対処していますか?

私はそれがうまくいくことを示しているように思われるこの関連する投稿を見ました: それ、自己または私-JavaScriptでどちらを好むか?

4

1 に答える 1

2

入れたところに

         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;
})());
于 2013-01-23T14:53:02.693 に答える