形参和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]