js中的函数
1.定义函数的三种方式
函数声明,函数表达式,构造函数new
2.箭头函数
- 不能使用arguments,super,new.target
- 不能作为构造函数
- 没有prototype属性
3.函数名
一个指向函数体的指针,所以函数可以相互赋值,有多个名字 函数有一个name的可读属性:
const func1 = function(){}
const func2 = ()=>{}
function func3(){}
const func4 = func1.bind(null)
console.log(func1.name)
console.log(func2.name)
console.log(func3.name)
console.log(func4.name)
console.log((()=>{}).name)
console.log(new Function().name)
4.参数
• 可传可不传,行参个数和传的也没必要个数一样 • 可以通过伪数组arguments来访问 • 都是值传递,对象传的是引用地址 • 没有重载 • 重复定义,下面的会覆盖上面的定义 • 默认参数为undefined,也可以手动指定,是在调用时才起作用,定义时不起作用 • 箭头函数也可以用默认参数,不能省略括号 5.参数作用域和暂时性死区
• 参数作用域:就是参数有自己的作用域,不能引用函数体的变量 • 暂时性死区:根据参数的顺序,后面的默认参数可以引用前面的值,但是前面不能引用后面的
6.es6的收集参数和arguments的区别
1.剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参。 2.arguments对象不是一个真正的数组,而剩余参数是真正的 Array实例,也就是说你能够在它上面直接使用所有的数组方法,比如 sort,map,forEach或pop。 3.arguments对象还有一些附加的属性 (如callee属性)。
7.函数声明和函数表达式
是否有函数提升
8.函数内部的arguments,this,new.target
arguments: 属性callee:含义是指向当前arguments对象所在的函数 严格模式不能访问 this: • 普通函数:指的是当前调用该函数时的上下文对象,默认是全局上下文对象(网页环境中是window) • 箭头函数:指的是定义函数的上下文对象 • caller:指的是当前调用当前函数的函数 func.caller arguments.callee.caller:和func.caller结果是一样的 arguments.caller:严格模式不能访问,非严格是undefined,为了区分func.caller,且不能赋值
9.函数的属性和方法
length:记录命名的形参个数 prototype:显示原型
10.尾调用优化
含义: • 没优化之前,每多一次嵌套函数,多一个栈帧 • 优化后,每次只存在一个栈帧 条件:
- 严格模式下
- 外部函数的返回值是对尾调用函数的调用
- 尾调用函数执行完,不需要额外的操作
- 尾调用函数不涉及闭包
11.IIFE
可以模拟块级作用域
12.关于函数中的this:
this关键字是函数运行时自动生成的一个内部对象,也被称作为环境对象,只能在函数内部使用。谁调用this,this就指向谁。谁调用我,我就指向谁 this的三种指向
- 普通函数; 函数名() this指向window
- 对象方法: 对象名.方法名() this指向对象
- 构造函数; new 函数名() this指向new创建实例对象
目录
作者:徐徐版权声明:转载请注明文章出处

~~空空如也