2
var a = {
    text : 3,
    logText : function () {
        console.log(this.text);
    },
    callLogText : function() {
        logText();
    }
};
a.callLogText();

これにより、ReferenceError: logText is not definedエラー メッセージが生成されます。

代わりにthislogText()メソッドに接頭辞を付ければ問題ありません。エラー メッセージは表示されません。

var a = {
    text : 3,
    logText : function () {
        console.log(this.text);
    },
    callLogText : function() {
        this.logText();
    }
};

私は本当に理由を理解することはできません。

4

4 に答える 4

4

JavaScript のスコープ規則を学ぶ必要があります。このブログ投稿は良い紹介です。

簡単に言えば、変数名を使用する場合、JavaScript はいくつかの規則に従います (この説明では、関数定義は変数宣言とほとんど同じです)。

おそらくあなたを混乱させるのはこれです:

var a = { b: ...};
var a = function() { var b = ... }

どちらの場合も、新しい variable を取得しますa最初のケースでは、プロパティ を持つオブジェクトbです。2 番目のケースでは、新しい変数が定義されているネストされたスコープを持つ関数です。 b

JavaScript は、変数の現在およびすべての親スコープを調べます。しかし、オブジェクト定義はスコープではありません。JavaScriptに関する限り、常に「現在の」オブジェクトを参照するb特別な変数を使用して表示しない限り、プロパティは表示されません(あなたの例では)。thisa

オブジェクトのプロパティはa「範囲内」にないため、JavaScript はlogText()を調べるように指示しない限り、見つけることができませんthis。何も言わなければ、JavaScript は現在のスコープ (関数の本体callLogText)、次に親スコープ (a定義されている)、その親スコープの順に検索します。

于 2012-08-02T07:25:57.450 に答える
0

呼び出し

logText();

logText()という名前の関数がどこかにあることを意味しますが、ここではlogText()をオブジェクトのプロパティとして定義しているため、logText()にアクセスするには、定義されているオブジェクトを使用してlogText()を参照する必要があります。この場合、それは同じオブジェクト内にあるので、これを言うことによって同じオブジェクトを参照します。

于 2012-08-02T07:24:53.813 に答える
0

それは癖ではありません。オブジェクトに関しては、ほとんどの言語がこのように機能します。

logText()a関数ではなく、オブジェクトのメソッドです。

this.methodName()として内部的に、または外部的にとしてメソッドを呼び出す必要がありますobject.methodName()

于 2012-08-02T07:18:13.727 に答える
0

logText();logText未定義のグローバル関数を実行することです。

this.logText();関数を実行すること a.logTextです。

于 2012-08-02T07:18:54.473 に答える