web-dev-qa-db-ja.com

オブジェクト内の「this」

私は、リクエストを介して渡される幅から静的な高さ要素を除外しながら、比例した高さを計算しようとしています(デフォルトは560)。

ただし、wF.hNaNと評価されます。 this.wを560に置き換えると動作しますが、wwFプロパティを参照しようとすると動作しません。

var wF = {
       w : 560,
       h : (312 - 42) / (560 / this.w) + 42
};

何が得られますか?

私は、JSからNiceコードを取得しようとしているため、2つの単純なvarを連続して使用することを拒否します。

更新:

私の問題の説明と解決に協力してくれた皆さんに感謝します。私はそれに慣れる必要があると思います。オブジェクトを段階的に設定して、プロジェクトを続行しますが、それでもまだ少しイライラします;)。同様の問題に出くわした人向けのトピックに関する素敵な記事を見つけて読みました。 http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/ =

49
mhe

こんにちは、2番目のプロパティを関数オブジェクトとして再定義するだけで機能します。関数内から呼び出し元オブジェクトのコンテキストにアクセスすることは可能だと思います

var wF = {
    w : 560,
    h : function() { return (312 - 42) / (560 / this.w) + 42; }
};

alert(wF.h())
22
houss

thisキーワードは、オブジェクトではなく呼び出しコンテキストを参照します。

次のような2つの手順でこれを行う必要があります。

var wF = { w: 560 };
wF.h = (312 - 42) / (560 / wF.w) + 42;
3
Paul Perigny

Object()で{...}をラップする必要はありません。すでにオブジェクトリテラルです。

thisはオブジェクトリテラル内では動作せず、関数が現在実行されているオブジェクトを指します。

function fn() {
   var wF = { w : 560, h : (312 - 42) / (560 / this.w) + 42 };
}

fn();

thiswindowオブジェクトを指すようにします。

編集:以前のコードは、thisが何であるかのデモンストレーションであり、答えを意図していませんでした。別の可能性は、引数として幅をとる関数を使用することです:

function getObject(width) {
    width = width || 560; //Default value to 560
    return { w: width, h : (312 - 42) / (560 / width) + 42 };
}

var wF = getObject(); //To get the default value, or specify a width otherwise.
1
Dennis