函数的拓展
- 函数参数的默认值,直接写在参数定义的后面
function fn(a,b,c=3){
console.log(c) //3
}
fn()
//使用解构赋值的方法传参
let arr = [1,2,3]
function fn([a,b,c]=arr){
console.log(a) //1
console.log(b) //2
console.log(c) //3
}
fn()
//length属性的返回值,等于函数的参数个数减去指定了默认值的参数个数
function fn1(a,b=5){
//要执行的代码
}
fn1(3)
console.log(fn1.length) //1
//函数调用时,参数y = x形成一个单独的作用域。这个作用域里面,变量x本身没有定义,所以指向外层的全局变量x。函数调用时,函数体内部的局部变量x影响不到默认值变量x
let x = 2
function fn1(y=x){
let x = 5
console.log(y)
}
fn1()
- rest 参数,形式为(…变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
const numbers = [6,4,8]
console.log(...numbers) //6 4 8
const sortNumbers = (...numbers) =>numbers.sort();
console.log(numbers.sort()) //[4 6 8]
- 严格模式,函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式,否则会报错
function x(a,b=a){
'use strict'
console.log(a) //Uncaught SyntaxError: Illegal 'use strict' directive in function with non-simple parameter list
console.log(b)
}
x(1,2)
//解决方案,将严格模式写在全局
'use strict'
function x(a,b=a){
console.log(a) //1
console.log(b) //2
}
x(1,2)
- name 属性
function fn(){
//需要执行的代码
}
console.log(fn.name) //fn
- 箭头函数
var fn = () =>{要执行的代码} fn()
var fn = (参数) =>要执行的代码 fn()
var fn = 参数=>{要执行的代码} fn()
var fn = () =>{return 5} fn()
var fn = () => 5 fn()
// 箭头函数有几个使用注意点。
//(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
//(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
//(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
//(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
- Function.prototype.toString(),toString()方法返回函数代码本身,以前会省略注释和空格,但现在不会,会一模一样的输出
function fn(){ /*你好世界*/}
console.log(fn.toString()) //function fn(){ /*你好世界*/}
- catch 命令的参数省略,catch代码块可能用不到这个参数。但是,为了保证语法正确,还是必须写。
let t = 10
setInterval(()=>{
try {
if(t1<10){
console.log('小于10')
}else{
console.log('大于等于10')
}
} catch(error){
console.log('失败了') //失败了
}
},1000)
let t = 10
setInterval(()=>{
try {
if(t1<10){
console.log('小于10')
}else{
console.log('大于等于10')
}
} catch{
console.log('失败了') //失败了
}
},1000)