函数的定义
方式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;