js-函数参数

145 阅读3分钟

形参和arguments

调用函数没有传递参数时,参数为undefined
调用函数传递的实参会按顺序传递给形参
调用函数传递undefined给形参时,会使用形参的默认值

function use(a,b=2,c){
    console.log(a,b,c)
}
use()  // undefined,2,undefined
use(null)  // null,2,undefined
use(1,undefined,2)  // 1,2,2

非严格模式下,改变形参,形参和arguments会保持相等

function setArgs(a,b){
     console.log(a===arguments[0],a,arguments[0])
    console.log(b===arguments[1],a,arguments[1])
    a='apple'
    b='banana'
   console.log(a===arguments[0],a,arguments[0])
    console.log(b===arguments[1],a,arguments[1])
}
setArgs(1,2)


VM685:2 true 1 1
VM685:3 true 1 2
VM685:6 true 'apple' 'apple'
VM685:7 true 'apple' 'banana'

严格模式下,改变形参,形参和arguments不会保持相等

function setArgs(a,b){
    'use strict'
    console.log(a===arguments[0],a,arguments[0])
    console.log(b===arguments[1],a,arguments[1])
    a='apple'
    b='banana'
    console.log(a===arguments[0],a,arguments[0])
    console.log(b===arguments[1],b,arguments[1])
}
setArgs(1,2) 


VM709:3 true 1 1
VM709:4 true 1 2
VM709:7 false 'apple' 1
VM709:8 false 'banana' 2

非严格模式下,形参具有默认值,会与严格模式表现结果一致。改变形参,形参和arguments不会保持相等

function setArgs(a,b=2){
    console.log(a===arguments[0],a,arguments[0])
    console.log(b===arguments[1],a,arguments[1])
    a='apple'
    b='banana'
    console.log(a===arguments[0],a,arguments[0])
    console.log(b===arguments[1],b,arguments[1])
}
setArgs(1,2) 



VM892:2 true 1 1
VM892:3 true 1 2
VM892:6 false 'apple' 1
VM892:7 false 'banana' 2

形参

当形参中具有默认值,length值是具有默认值之前形参个数

function getNum(a,b,c){
    console.log(getNum.length)
}
getNum()  // 3
function getNum1(a,b=1,c){
    console.log(getNum1.length)
}
getNum1()  // 1

形参可以传入表达式进行计算,计算是在运行的时候执行

let n=1
function getValue(){
    return n++;
}

function foo(a,b=getValue()){
    console.log(a,b)
}

foo(1,2)
foo(1)
foo(1)
foo(1)



VM1658:7 1 2
VM1658:7 1 1
VM1658:7 1 2
VM1658:7 1 3

变量的暂时性死区

在 JavaScript 中,let 和 const 关键字用于声明变量,它们有一个特性叫做“暂时性死区”(Temporal Dead Zone,TDZ)。这个概念是指在变量声明之前的区域,该变量是不可用的。

console.log(x); // ReferenceError: x is not defined  
let x = 10;

需要注意的是,let 和 const 声明的变量只在它们所在的块级作用域内有效。在块级作用域之外,这些变量是不可见的。

另外,与 var 关键字不同,let 和 const 声明的变量不会被提升(hoist)到作用域顶部。这意味着变量必须在声明之后才能使用,否则会出现 ReferenceError 错误。

形参的暂时性死区

function bar(a=getValue(b),b){
console.log(a,b)
}

bar(undefined,1)  //error

剩余参数

当函数需要设置不固定参数时,使用剩余参数,以伪数组的形式接收参数
剩余参数只能书写一个
剩余参数只能书写在最后一个参数位置上

function getNum(a,b,...nums){
    console.log(nums)
    // XXX
}
getNum(null,null,1,2,3,4,5,6)  // [1, 2, 3, 4, 5, 6]