2

Javascript、バックボーン、jquery を始めたばかりです。私の同僚は、Javascript で this の概念とコンテキストを説明しようとしていました。彼は、このタイプのパターンが一般的であると言っていましたが、それを行うより良い方法があるかもしれません. それが実際に「標準」パターンなのか、それとももっと良い方法があるのか​​ 疑問に思っていました。

基本的に、パターンは、画面に表示されているものを処理しているクラスにいるとき (私たちにとっては、MVC とバックボーンの組み合わせです)、データを取得してページに入力する必要があります。しかし、フェッチする前に、

var _this = this;

私たちが行う ajax 呼び出しは非同期であるため、成功ハンドラーで実行した場合、彼はこう言っていました。

this.model.property = // set some property from the callback

これは私たちが望んでいることではなく、私たちがしなければならないことです

_this.model.property = // something

これがかなり標準的なのかどうか疑問に思っていたと思います。Javascript を 1 週間使用した後、サーバーからデータをフェッチするたびに実行しているように感じます。また、_.each ブロックで「これ」が変更されていると推測されるため、アンダースコアの _.each を使用してページをフォーマットしようとする前に、時々実行しています。同じように。ありがとう!

4

2 に答える 2

1

関数をコンテキストにバインドできるため、非同期呼び出し中に煩わしいものを使用する必要はありません

var _this = this
//or
var self = this;

underscore.jsバインド関数を使用できます。

//this - current context
var func = function ({ this.doSomething(); });
var bindedFunction = _.bind(func, this);

したがって、bindedFunctionを呼び出すと、currentContextにバインドされます。

バックボーンを使用している場合、通常はコールバック関数をバインドするため、オブジェクトにバインドされます。

var MyView = Backbone.View.extend({
        initialize: function (args) {
            _.bindAll(this, 'onDataFetched'); 
        },
        fetchData: function () {
            $.ajax({
            //... some code
                success: this.onDataFetched
            });
        },
        onDataFetched: function(result) {
            //Do something usefull here
            //this = MyView instance
        }
});
于 2013-03-22T09:34:41.863 に答える
1

スコープは JavaScript の最もトリッキーな部分の 1 つです。基本的に、それはあなたの友人が説明していることです。スコープを完全に理解することは、javascript を使いこなすための鍵です。何が起こっているのかを完全に理解するには、次のリンクのいくつかを確認してください。

  1. 関数とスコープに関する Mozilla の記事
  2. 別の良い記事

とにかく、特に node.js が私の人生に道を見つけた後は特に、個人的に私のお気に入りの言語である javascript が好きになることを願っています :)

編集:

実際にあなたの質問に答えるには:何が起こっているのかというと、非同期モードでコンテキストが失われているため、スコープがthis変更されています。保存しておくと、後で参照できます。お役に立てれば!

于 2013-03-22T08:23:10.870 に答える