3

私はここで JS を学んでおり、引数として渡されたときのプリミティブ値に関して質問があります。私は単純な関数を持っているとしましょう:

var first = 5;
var second = 6;

function func(){
    first+=second;
}
func();
alert(first); //outputs 11

したがって、この場合、first の値は 11 になります。しかし、関数の引数として first を渡して試してみると、first は 5 のままです。

var first = 5;
var second = 6;

function func(first){
    first+=second;
}
func(first);
alert(first); //outputs 5

誰かが私にこれを説明できるかどうか疑問に思っています。

4

4 に答える 4

4

これは、引数なしで呼び出すfunction first()と、グローバル var "first" が使用されるために発生します。しかし、 を呼び出すとfunction first(first)、最初はローカル変数 (関数内のみ) であり、グローバル var に変更を加えないことをブラウザーに伝えますfirst。コードは次のとおりです。

var first = 5;
var second = 6;
function func(first){
    first += second; //Local var "first" + global var "second"
    alert(first); //Local var, outputs 11
}
func(first);
alert(first); //Global var, outputs 5
于 2012-05-09T00:16:40.763 に答える
2

Javascript のスコープにより、スコープ変数firstは最初にグローバル変数をオーバーライドします。secondつまり、関数内のスコープ バージョンfirst(関数内で宣言しているためスコープが設定されています) に追加していて、グローバル バージョンのfirstは影響を受けません。

関数から 's 宣言を削除するとfirst、Javascript は次のバージョン (firstこの場合はグローバル バージョン) を探します。

于 2012-05-09T00:16:27.087 に答える
1
var first= 5;
var second= 6;

function func(first){

first+=second; // change the local first variable

}
func(first);
alert(first);//outputs 5 - the outer variable wasn't changed.

var first= 5; // global var
var second= 6;

function func(){ // first wasn't defined in the inner scope.

first+=second; // change the global bar

}
func();
alert(first);//outputs 11 - the outer variable was changed.
于 2012-05-09T00:17:10.623 に答える
0

Mark Linus はあなたの答えを正しく理解しましたが、重要な注意事項を追加したいと思います。JavaScript のプリミティブ値は常に値によって渡されますが、配列とオブジェクトは常に参照によって渡されます。例:

var first = [ 'a', 'b' ];

function func( arr ) {
    arr.push( 'c' );
}

func( first );

alert( first.join( ',' )); // output is 'a,b,c'

オブジェクトまたは配列にオブジェクトがある場合は、さらに複雑になります。変更はプログラム内のすべてのインスタンスに影響することを覚えておいてください。

于 2012-05-09T07:21:55.043 に答える