0

だから私は次のことをしようとしています。

var myVar;  

function testFunction(args){  
args.cacheVar = new Date();  
}  

testFunction({cacheVar:myVar});

ただし、myVar の値を変更する代わりに、args.cacheVar の値を変更します。私がしたいのは、myVar = new Date() です。args.cacheVar ではありません。

現在のセットアップでこれを達成するにはどうすればよいですか? (引数を使用)

4

2 に答える 2

1

参照を渡していますtestFunctionが、それはその場で作成したオブジェクト リテラルへの参照です: testFunction({cacheVar:myVar});<--{}は参照されるオブジェクトです。変数に割り当てられることはないため、testFunction返されるとすぐに GC されます。プロパティには の値のコピーが割り当てられ
ます(この場合は未定義)。参照によって渡されるオブジェクトのみが配列、オブジェクト リテラル、カスタム オブジェクト、関数を返すことを覚えておく必要がありますが、すべてプリミティブである、、およびを返すことができます。ところで、このルールを証明する例外です (歴史的な理由で返されます)。cacheVarmyVartypeof somethingobjectundefinedstringbooleannumbernullobject

の値を変更したい場合はmyVar、次のようにしますmyVar

function testFunction()
{
    myVar = new Date();
}
//alternative:
function testFunction()
{
    return new Date();
}
var myVar = testFunction();

ただし、最初の方法はあまり安全ではありません (暗黙のグローバル)。変更したい変数に目的の値を直接返すか (2 番目のバージョン)、クロージャーを使用するか、すべてをオブジェクトに変換します。私たちは今、遠すぎます

于 2012-10-31T15:44:00.680 に答える
0

関数に渡していませんmyVar。オブジェクトを渡しています。そのオブジェクトは更新される可能性がありますが、どこにも参照がないため、何も起こりません。

オブジェクトを渡す前に、オブジェクトを変数として保存する必要があります。

var myVar = {cacheVar:null}; 

function testFunction(args){  
    args.cacheVar = new Date();  
}  

testFunction(myVar);
于 2012-10-31T15:42:57.967 に答える