Js高级视频习题中犯过的错误

在这里插入图片描述

上面习题中出错的原因在于,没有理清楚,作用域(全局作用域)和执行上下文的关系(全局上下文,局部执行上下文),分析如下 ,当执行到show这个函数里面f()时,在栈里面产生了一个函数上下文,然后现在就会跳转到fn这个函数所在的虚拟栈里面(栈内部的一个封闭空间),执行console.log(x)这个语句时,会找x,此时会在对应的函数上下文环境中找,没有找到的话,就会去这个函数上下文对应的作用域,这个函数作用域的父级作用域找,直至找到全局作用域<(说白了找作用域的话,直接看代码的直观结构就可以了,当然上面的例题也说明了,上下文可以改变 即将要查找的自身作用域和父级作用域的问题)/font>

第二个面试题目

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

上面的例题里面,查找变量时,如果这个变量是基本类型变量,会根据作用域的来进行自动查找,但是,如果这个查找的这个变量是引用类型变量时,就可以直接通过地址去查找,而不是利用作用域去查找,所以上面就有了console.log(fn2)和console.log(this.fn2)的区别

这个下面没有用到"闭包"

在这里插入图片描述

注意,下面的这个地方用到了闭包,其中,上面的变量,that被保存起来了

在这里插入图片描述

下面这个函数里面为什么有闭包

1. function函数的嵌套

在这里插入图片描述

2. 内部函数“引用”了外部函数内部的“局部变量”,这个题中的第二个条件是指的是“n这个局部变量,注意,不是指fun这个函数变量(因为它不是局部变量,即使它是局部变量,它也不能算)”

3. 执行了内部函数定义

另外,需要特别注意的是下面中的第一个fun是指的是“这里的外部函数名变量fun(也就是这里的第二个fun),而不是指的是第三个fun”

在这里插入图片描述

原因是为什么呢?,很简单,fun(m,n)意味着,这个fun肯定指向一个函数对象,然而第二个fun的本质,明显是一个“基本变量类型的数据”,也就是说它不是一个引用类型的变量,所以,可以直接排除掉

下面这个超级难的题目,可以熟悉的知识点是

1. 什么时候产生新的闭包(内部函数被重新创建时,或者是外部函数被再次调用时),否则不会产生新的闭包

2. 既然,不会产生新的闭包(也就是不会在堆空间中继续产生一个空间,来保存闭包中数据的话),那么只要,我们去调用同一个闭包所处的函数对象时(执行内部函数时,就可能修改那个局部变量的值(位于闭包中的局部变量类似于全局变量,因为它具有不自动释放的特点(这个和闭包的特点有关)))

闭包终极面试题目

在这里插入图片描述

上面例题中,要重新理解下闭包产生条件中的“执行内部函数定义(也就是外部函数被调用时)” 上面例题中的这句话,a= fun(0)其实就是嵌套的外部函数被调用了,此时内部函数return {},其中{}在这里其实就是内部函数了,因为{}中包含了一个函数对象,只不过这个函数对象作为{}对象的属性而已,因此,当a= fun(0)这句话执行的时候,就使得内部函数执行了函数定义了,也就是说,此时闭包就已经产生了,特别注意的是,此时,闭包中的变量就已经有值了,而且此时,n=0,(这就是我个人认为的闭包中的变量类似于一个全局变量)

特别要注意的另外的一点是,即使新的闭包产生了,但是这个闭包中的局部变量还是那个n,不会产生多个变量n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值