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()不带参数调用时,它使用全局变量“first”。但是当你调用时function first(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不受影响。

如果您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 回答