1

トピックのタイトルが良くなくてすみません。名前の付け方がわからない。

この例について助けが必要です。完全に迷っています。

関数fillViewが呼び出されたときはすべて問題ありませんが、サイズ変更で2回目に呼び出されたときは機能しません。これは、レンダー関数内で「this」がウィンドウを定義しますが、localClassのインスタンスを定義しないためです。この問題を理解する方法の説明が必要です。例を書いてください。

(function ($) { 
var localClass = function(options) {
    this.a = 123;
};

localClass.prototype.render = function() {
    console.log(this.a);
}

$.fn.fillView = function(options){
    var view = new localClass(options);
    view.render(); //this prints to console 123

    $(window).resize(view.render); //this doesn't print 123 
                                     because 'this' is now - Window

    }
})(jQuery)
4

1 に答える 1

3

交換

$(window).resize(view.render);

$(window).resize(function(){view.render()});

新しいブラウザーのみを対象とする場合 (つまり、IE8 と互換性がある必要はありません)、bindも使用できます。

$(window).resize(view.render.bind(view));

使い方 :

1)関数を渡すときは、別のプロパティの値をその関数に設定するだけです。やってるようなもの

var f = view.render.

そして、この関数が呼び出されると、たとえば次のように呼び出されます。

f(); 

this関数内で が である理由がないことは、より明確かもしれませんview。実際、ここだろうwindow。より正確には、関数内の は、関数の最初の「所有者」ではなく、関数の呼び出しthis方法に依存する受信者です。

実際、それは別のオブジェクトだった可能性があります:

f.call(someObject)

次に(これは)になりthisます。frendersomeObject

2)しかし、あなたが関数を渡すとき

var f = function(){ view.render() }

はレシーバーとして呼び出されるfため、どのように呼び出すかは問題ではありません。renderview

3)他の解決策があります:bindまたは$.proxy両方とも、あなたのものを埋め込む新しい関数を構築しthisますが、常にあなたが渡すオブジェクトであることを確認してください。

于 2013-07-08T19:31:17.343 に答える