7-5 函数的参数

26 阅读1分钟

参数的默认值

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