文章目录
  1. 1. 1.定义
  2. 2. 2.区别
  3. 3. 3.注意
    1. 3.1. 1.如果实参是引用类型(object,array),那么对形参值进行修改,会影响到实参的值.
    2. 3.2. 2.形参与局部变量重名情况的处理

1.定义

形参:定义函数时候使用的参数,目的是用来接收调用该函数的时候传进来的实际参数.

实参:函数被调用的时候传递给函数的实际参数.

eg:

1
2
3
4
function fun (a,b,c){
console.log(a,b,c);
}
fun(1,2,3);

这里的abc就是形参,1,2,3就是实参.

2.区别

形参和实参是不同的变量.他们在内存中处于不同的位置.

形参在函数运行结束时释放.

3.注意

1.如果实参是引用类型(object,array),那么对形参值进行修改,会影响到实参的值.

eg:

1
2
3
4
5
6
var obj = {sex:'男'};
fucntion fun ($obj){
$obj.sex = '女';
}
fun(obj);
console.log(obj.sex);//'女'

解释说明:

函数的参数传递有2中方式:值传递和引用传递.
值传递:形参是实参的一个副本,对形参的改变不会影响实参.
引用传递:形参是对实参引用变量的复制,导致形参和实参都指向同一个对象实体(同一内存),所以改变形参,实参也会变.

2.形参与局部变量重名情况的处理

当局部变量未声明,或者已经声明为赋值的情况下.此时内存中还没有这个变量.这时候调用同名变量那么就是形参.

反之,当局部变量赋值完成以后,内存中已经存在这个变量,并且覆盖了同名的形参.在调用同名变量,那么指的就是已经赋值的局部变量.

eg:

1
2
3
4
5
6
7
8
function fun (str){
alert(str); //'hello'
var str = str + 'node.js';
var name = str;
alert(str); //'hello node.js'
alert(name); //'hello node.js'
}
fun('hello');

唯一个不是很清楚的问题就是变量提升,模拟一下解释器创建执行环境.

1
2
3
4
5
6
7
8
9
function fun (str){
var a;
var name;
alert(str);
str = str + 'node.js';
name = str;
alert(str);
alert(name);
}

解释:

由于存在变量提升,执行第一个alert()的时候,局部变量str只声明了,没有赋值.内存中还没有创建局部变量str,所以alert()str是形参.
执行str = str + 'node.js';,左边str是局部变量,右边str是形参,互不干扰,此时局部变量str被赋值了'hellonode.js';
name = str此时的str是局部变量.

所以我们在实际代码中,为了规避掉这个问题,我一般都会在形参前面在加个$,用以区分和容错.(个人见解)

文章目录
  1. 1. 1.定义
  2. 2. 2.区别
  3. 3. 3.注意
    1. 3.1. 1.如果实参是引用类型(object,array),那么对形参值进行修改,会影响到实参的值.
    2. 3.2. 2.形参与局部变量重名情况的处理