这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战
定义
js函数的参数分为形参
和实参
,形参是定义函数的写的参数,而实参是调用函数时传递给函数的实际参数。
通过例子来说明:
function fn (name) { // 这里答案cp3是形参
console.log(name)
}
fn('答案cp3') // 这里答案cp3是实参
使用
我们在调用函数的时候经常会传参数,然后各种类型的参数,比如数字,字符串,对象等等。
如果我们在函数内部对这些参数进行重新赋值,那么会不会改变外面的变量呢?这个问题经常会在面试中被问到。
对于这个问题,需要根据参数的类型来区分讨论。
第一种情况: 参数是基本类型
如果对基本类型直接赋值,则不会影响外面的变量。
例子如下:
const name = '答案cp3'
function fn(name) {
name = 'test'
}
fn(name)
console.log(name) // 答案cp3
从以上例子可以看到,fn里对name重新赋值不会影响到外面的name变量。
第二种情况:参数是引用类型
针对参数是引用类型
如果对引用类型直接赋值,则不会影响外面的变量。
但是如果是对引用类型的属性进行操作,实际上并没有改变引用类型的内存地址,则也会影响外面的变量。
例子如下:
const obj = {name: '答案cp3'}
function fn(obj) {
obj = {name: 'test'}
}
fn(obj)
console.log(obj) // {name: '答案cp3'}
const obj = {name: '答案cp3'}
function fn(obj) {
obj.age = 18
}
fn(obj)
console.log(obj) // {name: '答案cp3', age: 18}
可以看到,第一个例子没有影响到外面的变量,第二个例子影响到外面的obj变量了。
额外补充
如果我们在函数对形参进行var
声明,形参会变量提升,但是形参会立刻被传入的实参赋值,所以打印的不是undefined
。
如下:
const name = '答案cp3'
function fn(name) {
console.log(name) // 答案cp3
var name = 'test'
}
fn(name)
但是如果我们对形参申明同名函数呢?形参(函数)会变量提升,但是形参并不会被被传入的实参覆值,而是被同名函数覆值。
const name = '答案cp3'
function fn(name) {
console.log(name) // ƒ name () {}
function name () {}
}
fn(name)
感慨: js真是一个神奇的语言