今天来学习下js函数的参数

310 阅读2分钟

这是我参与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真是一个神奇的语言