0

例:

function SomeCall(){
      return "Bill";
}

var a = [];
a.push(SomeCall());

var obj = {
      name: SomeCall()
};

//is function CALLED here or does this already contain "Bill"?
console.log(obj.name); 
console.log(a[0]); //what about here?

配列内のオブジェクトまたはアイテムの値にアクセスすると、その時点で関数が呼び出され、値が返されますか?それとも、プッシュ/割り当て時に関数を呼び出して戻り値を保持しているのでしょうか。

4

2 に答える 2

2

この関数は、()が使用されるとすぐに呼び出されます。したがって、配列には関数の戻り値が含まれます。関数自体を保存する場合は、a.push(SomeCall)後で使用して呼び出します(a[0]())。常に特定のパラメーターを使用して呼び出したい場合は、呼び出しを含む匿名関数を保存します。

a.push(function() {
    return SomeCall(your, params);
});

ただし、最新のJSエンジン(つまり、「古い」IEバージョンではない)では、アクセサーを定義できます。これにより、特定のプロパティが読み取られる(または書き込まれる)ときにコードを実行できます。

var obj = {};
obj.__defineGetter__("name", SomeCall);

次に、への読み取りアクセスobj.nameは、の結果を返しSomeCall()ます。

于 2012-12-23T00:17:59.283 に答える
1

JavaScriptは遅延言語ではないため、関数の呼び出しを別の関数の呼び出しにコーディングすると、内部関数呼び出しの結果が外部関数に渡されるという効果があります。

したがって:

a.push(SomeCall());

事実上次のようなものです:

var temp = SomeCall(); // call function, get result
a.push(temp);

同様に、オブジェクトリテラル式では、プロパティ宣言の右側が評価され、評価の結果はプロパティの値になります。

于 2012-12-23T00:16:22.043 に答える