length
(function fn(a, b = 2){}).length // 1
函数的 length 属性为该函数预期传入的参数个数,当为参数设置默认值之后,该参数不再是预期传入的值,length属性不计入该参数。同时,如果设置默认值的参数不在尾部,该参数之后的参数也不计入 length
:::success
(function fn(){}).length // 0
(function fn(a, b){}).length // 2
(function fn(a, b = 2){}).length // 1
(function fn(a, b = 2, c){}).length // 1
:::
=>
let foo = () => { a: 1 }; foo() // undefined
箭头函数调用时,这里的{}被认为是代码块,而不是对象,执行里面的 a: 1; a: 会被解析为标记,因此函数执行了 1; 就结束了。
:::warning
a: 标记
一般用在多重循环中,continue 和 break 后接标记名 返回代码段到标记的位置。
:::
参数
function fn(x = 10){ let x = 200 } fn() // Uncaught SyntaxError: Identifier ‘x’ has already been declared
在函数参数中接收的参数变量是以类似 let 方式定义的,因此在函数内部声明同名变量,会引起 let 报错。var x = x || 10;
但js为了兼容诸如此类代码,在函数内部使用 var 关键字声明同名变量时,并不会发生报错,js可以正常解析。
function fn(x,x){console.log(x)} fn(1,2) // 2
在参数中出现同名形参时,取用最后一个形参的值。
:::warning
function fn(x = 0,x){console.log(x)}
fn(1,2) // Uncaught SyntaxError: Duplicate parameter name not allowed in this context
let f2 = (x,x) => x;
f2(2,3) // Uncaught SyntaxError: Duplicate parameter name not allowed in this context
:::
当参数具有默认值或者函数为箭头函数时,会发生函数参数重复的报错。