参数的默认值
x, y 我们叫做形参,在调用的时候传入参数
function foo(x, y){
// ES5 如果传入的y 是0,实际上这种写法不太严谨,还需要再做判断
y = y || 'xx'
console.log(x, y)
}
foo('aa')
// ES6 的写法,函数参数的默认值
function foo(x, y = 'xx'){
console.log(x, y)
}
foo('aa', 0)
// 参数变量是默认声明的,不能再次声明,参数的名称也是不能重名的,实参跟形参是通过顺序一一对应的,有默认值的参数要写在最后一个参数上
function foo(x = 5){
let x = 1
}
foo()
function foo(x , z, y){
console.log(x, y, z)
}
foo(1,2)
解构赋值
function foo({x, y = 5}){
console.log(x, y)
}
// foo({}) undefined 5
foo({
x:1,
y:2
})
// foo() // 都不传的话就会报错
function ajax(url, {
body = '',
method = 'GET',
headers = {}
} = {}){
console.log(method)
}
ajax('http://www.xx.com',{
method:'POST'
})
length
返回的没有指定默认值的参数的个数
function foo(x, y ,z = 3){
console.log(x,y)
}
console.log(foo.length) // 2
作用域
let x = 1
function foo(x, y = x ){
console.log(y) // 2
}
foo(2)
当我调用这个函数的时候就形成了一个作用域,y取值的时候就直接取作用域内的值
let x = 1 // 存在全局
function foo( y = x ){
let x = 2 // 存在作用域内
console.log(y) // 1
}
foo()
会沿着作用域链一层一层的往外找
function foo(y = x){
let x = 2
console.log(y) // x is not defined
}
foo()
函数的name 属性
function foo(){}
console.log(foo.name)
console.log((new Function).name) // anonymous
function foo(){
console.log(this)
}
foo.bind({name: 'xx'})()
bind第一个参数值得是当我们调用方法的时候,希望方法里面的this指向谁就作为bind的参数传入
console.log(foo.bind({}).name) // bound foo
console.log((function(){}).bind({}).name) // bound