1、简介
本文介绍了js中函数传参问题。属于根底内容。
你能够先查看看下如下练习题,如果很轻易就能够实现,就不用往下看啦。
2、练习题
以下有6道题。
题1
var a = [1];
var b = a;
b = [10]
console.info(a)
console.info(b)
题2
var a = [1];
var b = a;
b[1] = 10
console.info(a)
console.info(b)
题3
var a = [1];
function f(a){
a = [10]
}
f(a);
console.info(a)
题4
var a = 1;
function f(a){
a = 10
}
f(a);
console.info(a)
题5
var a = [1];
function f(a){
a[1] = 10
}
f(a);
console.info(a)
题6
var a = [1];
function f(a){
a[1] = 10
a = 3;
}
f(a);
console.info(a)
答案:
题1: a:[1], b: [10]
题2: a:[1,10], b: [1,10]
题3: a:[1]
题4: a: 1
题5: a: [1,10]
题6: a: [1,10]
3、内容
1.数据的保留形式
2.赋值运算符的含意
3.参数传递的实质
4.例题解说
4、数据的保留形式
js中的数据类型分成两大类:根本数据类型和援用数据类型。
不论是何种数据类型都须要有一个中央把数据的内容保留下来,在咱们给变量赋值的过程中,就是在做保留的过程。
在如下两行代码中,咱们别离把一个根本数据类型的数据和援用类型的数据保留在两个变量中,
var a = [10];
var b = 1;
咱们先回顾数据保留的形式:
根本数据类型的类型保留在栈区;
援用数据类型的数据要用到两个区域:在栈区保留的是一个地址信息,而在堆区保留着真正的数据,这个堆区的地址就在栈区中保留着。
5、赋值运算符的含意
赋值运算符是咱们最罕用的运算符:= 。 当咱们在写一个赋值运算符时,其实背地的工作还是很多的。以如下:
5.1、左边是值
varName = value;
它示意把等号左边的值保留到等号右边的变量(或者是常量)中。
背地做的事有:
查看等号右边的这个变量是否存在。如果不存在,是否容许创立这个变量。这一步没有问题了,再去看左边。
把左边的值找个中央存起来,此时就要依据左边的值是援用类型还是根本数据类型来决定如何去保留它了,如果是根本数据类型,则间接保留在栈区;如果是援用类型,则先在堆区中保留数据,再把地址保留在栈区。
5.2、左边是变量
varName = var1;
它示意把等号左边的变量中保留的值赋值到等号右边的变量(或者是常量)中。是间接把栈区中的保留的内容进行赋值。
5.3、例子
咱们接着下面的代码来:
var a = [1];
var b = a; // 留神这一句
给通过下标给b赋值
var a = [1];
var b = a;
b[1] = 10; // 把10保留在第二个元素中。
后果如下:
a:[1,10], b: [1,10]
var a = [1];
var b = a;
b[1] = 10;
b = [10]; // 把数级保留在b中
6、函数中的参数传递
6.1、实质
在函数的调用过程中,存在传值的过程 具体来说,是实参的值传给形参。
咱们能够这样来了解这个过程:
函数的形参就是函数外部定义的局部变量。
实参传递给形参的过程就是一个赋值过程。
函数调用完结后,局部变量会被回收。
6.2、例子
上面来看一个例子
var a = [1];
function f(a){
a[1] = 10
a = [10]
}
f(a);
console.info(a)
我将分步骤来解说这个过程。
初始状况下:
在调用f(a)时,相当于是做了一次赋值操作:把全局变量a的值赋值给局部变量a(赋值的外部是栈中的内容)。后果是它们指一个数组。
上面执行函数体中的第一句:
上面执行函数体中的第二句
最初一步:
函数调用完结,开释函数中的变量及对应的空间。
函数调用结束,开释空间。局部变量a,及f-堆中的数组全回收了。此时拜访的a是全局变量。
7、总结
根本数据类型只须要用到栈区;援用数据类型须要用到栈区和堆区;
赋值是把左边的值保留到右边的变量中;赋值的过程中传递的栈区的内容;
函数中的形参相当于函数外部的局部变量 ;实参传给形参的过程就是赋值的过程;
函数调用实现后,它的局部变量会随之销毁,除非遇到非凡状况(例如闭包)
发表回复