JS中函数的相关概念 1.定义具备某一功能的工具即是数据值也是对象。2.字面量声明function nameFunc{ 函数体即代码块}函数表达式不同于声明函数表达式只表示定义了一个函数对象3.调用nameFunc4.函数提升字面量声明的函数会被提升到代码块的顶部原因是执行上下文中确定变量对象中会将函数名准备好的同时把函数名指向函数对象函数对象的创建和这个确认过程是同步的不会出现函数对象没创建函数名没法指向的情况这个过程发生在代码执行前因此有函数提升变量提升也是如此5.参数形式参数定义时的参数实际参数调用时传入的参数JS函数参数的传递是值传递即如果传递的是引用类型则使用的是同一个地址。Function.prototype.arguments一个伪数组存放函数传入的所有实际参数包括多出的参数与形参会有双向绑定。实参会都存入到形参和arguments中改变一个另一个也会改变剩余参数...参数仅在函数定义的形式参数中...表示的是收集剩余参数其余情况是展开运算符6.返回值调用函数后得到的结果即是返回值用return定义如果没定义则返回undefined。执行上下文有一个返回值槽return会把返回值槽的值抛给调用者然后直接摧毁执行上下文函数会终止return是函数变量对象ao销毁前的最后一个操作。7.函数作用域函数的作用域是函数对象存在它就存在如果函数对象被销毁函数作用域就被销毁。作用域链变量对象会有一个额外属性指向创造该变量对象的函数函数会有一个隐藏属性[[scope]]指向创建该函数的变量对象拿取变量时先找变量对象自身没有再通过变量对象额外属性找到创造自身的函数再通过函数的[[scope]]找到下一个外层变量对象依次向下查找闭包现象作用域链的存在让定义在内部的函数可以通过[[scope]]访问外部函数的变量对象且当内部函数未被销毁时外部函数的变量对象由于被内部函数通过[[scope]]指向了因此不会被销毁就这样驻留在内存中但这样极大可能导致内存泄露即驻留了完全用不到的大数据8.函数类型普通函数直接调用返回结果字面量声明this默认绑定构造函数:用new调用用来创建对象实例this会绑定给new出来的新对象方法函数函数作为对象的属性this指向调用者箭头函数{}this继承外层作用域的this回调函数作为参数传递给其他函数this默认绑定IIFE立即执行函数func{}()定义后立即调用函数名只有内部能调用9.改变this的函数实例方法Function.prototype.apply(对象[实参列表])立即执行函数实例将该函数的this绑定为输入的对象第二个参数是实参列表需要拆分实参数组Function.prototype.call对象实参列表即执行函数实例将该函数的this绑定为输入的对象剩余的参数是实参列表Function.prototype.bind(对象实参列表)不执行创建一个新函数拷贝调用的函数但改变这个新函数的this为输入的对象。10.函数递归函数的内部调用自身声明式编程的重要概念需要有终止条件否则会无限递归