红宝书阅读笔记!第六天_函数(3)

209 阅读2分钟

函数表达式

两种方式👇:

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