函数表达式
两种方式👇:1.函数声明:
function functionName(){
函数体
}
特点:函数声明提升
2.函数表达式:
let functionName : function(){
函数体
}
匿名函数、兰姆达函数
递归
arguments.callee是一个指向正在执行函数的指针。比如编写阶乘函数时可以return一个num * arguments.callee(num-1)的表达式。但是在严格模式下访问会出错,此时可以使用命名函数表达式来达到目的。
尾调用优化
function outerFunction(){
return innerFunction();//尾调用
}
ECMA6优化前出栈过程👇
ECAM6优化后出栈过程👇
很快啊,啪的一下就看懂了
1.尾调用优化条件
· 代码在严格模式下执行· 外部函数的返回值是对尾调用函数的调用
·尾调用函数返回后不需要执行额外的逻辑
·为调用函数不是引用外部函数作用域中自由变量的闭包
2.尾调用优化的代码
oh实在是有点复杂
function fib(n){
return fibImp1(0,1,n);
}
function fibImp1(a,b,n){
if(n===0){
return a;
}
return fibImp1(b,a+b,n-1);
}
我也不知道优化在哪里
闭包
闭包指的是引用了另一个函数作用域中变量的函数,通常是嵌套函数中实现的。如果我没有理解错,使用闭包会产生大量的内存占用,因为匿名函数的存在所以外部函数的活动对象仍在会保存在内存中。
建议反复阅读全文背诵写的很好❗
1.闭包中的this对象
如果函数内部没有使用箭头函数绑定,则this对象会在运行时绑定到执行函数的上下文。如果在全局函数中使用,非严格模式下指向window,严格模式下指向undefined。匿名函数下同上。每个函数被调用时,都会自动创建两个特殊的变量:this和arguments。内部函数永远访问不到外部函数的这两个变量。但是可以把this保存到闭包可以访问的另一个变量中。
window.identity = 'The Window';
let object = {
identity: ' My Object',
getIdentity(){
let that = this;
return function{
return that.identity;
}
}
}
2.内存泄漏
详情请见P314立即调用的函数表达式
这里呢,就是强调了一下let关键词的重要性。
ECMA5里没有let只有var所以要用//IIFE来模拟块级作用域。
私有变量
函数章节里最后一小部分咯!不过现在看起来好吃力,过两天补充
文章内容参考:JavaScript高级程序设计(第四版)标题样式来自:juejin.cn/post/684490…
哪里写错了就联系我🐧:54269504