js-函数Function

96 阅读2分钟

函数的定义

方式1:声明式
function a(){}

方式2: 定义式
var a = function(){}

区别:声明式会提升到上下文的顶部

函数的提升

// a = undefined
// function a(){}
// a =1

var a = 1
function a(){}

console.log(a)
// 都是1

函数的名字

老版本的node,定义式的函数如果没有定义名字,是没有名字的,但是新版node的都有,堆栈也是跟踪到(就是抛出错误时,知道函数叫啥名)

var a = function woot(){}
console.log(a.name); // 'woot'

var a = function (){}
console.log(a.name); // 'a'

function a(){}
console.log(a.name); // 'a'

函数的参数数量

var f = function(a,b,c){
  console.log(f.length);  // 3
  console.log(arguments.length); // 4
}
console.log(f.length); // 3
f(1,2,3,4)

函数名.length 是指该函数定义的参数数量;
函数内部 arguments.length 是指调用该函数实际传参的个数;

尽管这在浏览器端很少使用,但是,它对我们非常重要,因为一些流行的Node.js框架就是通过此属性来根据不同参数个数提供不同的功能的。

函数高级

  • 原型与原型链

  • 执行上下文与执行上下文栈

  • 作用域与作用域链

  • 闭包

  • 构造函数

传参形式

// 1. arguments
function fn(){
  console.log(fn.length);
  console.log(arguments);
}

fn(1,2,"qwe")  // 0    [Arguments] { '0': 1, '1': 2, '2': 'qwe' }



// 2. ES6 剩余参数操作符,只能参数列表的最后一个
function fn(...rest){
  console.log(rest); // [ 1, 2, 'qwe' ]
}

fn(1,2,"qwe")

// 3.参数默认值
function fn(param1,param2 = 2, param =3){}


// 4.参数解构(也可以配置默认值使用)
function fn({name,age = 18}){}
const person = {
	name: "张三",
  age: 22,
  gender: 1
}
fn(person)

剩余参数和arguments的区别:

  • 剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参。

  • arguments对象不是一个真正的数组,而剩余参数是真正的 Array实例,也就是说你能够在它上面直接使用所有的数组方法,比如 sort,map,forEach或pop。

  • arguments对象还有一些附加的属性 (如callee属性)。

箭头函数

this指代问题;

箭头函数中没有arguments;