js经典问题。闭包,作用域,作用域链,原型,原型链等

本文深入探讨JavaScript中的闭包、作用域和作用域链,解析它们的工作原理及优缺点。闭包允许外部访问内部变量,但也可能导致内存泄漏。作用域决定了变量的可见性,而作用域链则连接了不同作用域。解决闭包内存泄漏可通过垃圾回收机制。同时,文章还涉及原型链继承、函数调用中的this指向、异步编程、回调函数等核心概念,为理解和优化JavaScript代码提供基础。
摘要由CSDN通过智能技术生成

1.闭包是什么 闭包的优点和缺点是什么
函数return返回一个函数
优点:函数外部可以调用函数内部变量;变量不会被污染
缺点:会导致内存泄漏

2.什么是作用域
变量的执行环境

3.什么是作用域链
[[scope]]:每个javascript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供javascript引擎存取,[[scope]]就是其中一个。[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。即作用域决定了代码区块中变量和其他资源的可见性,作用域与作用域之间通过 scope 连接从而形成了作用域链
scope 是一个数组存所有存放所有使用的变量

4.如何解决闭包导致内存泄露
可以利用垃圾回收机制中标记清除法;
1再满足条件收;将引用函数的变量 赋值为 null 做到零引用
立即执行函数;因为立即执行函数为零引用

5.从作用域的角度 说一下 为什么闭包中外部可以访问内部的函数变量
因为外部接收了函数reutrn 返回的函数 实际上变量存的是函数的指针;return 返回的函数是 函数的子作用域;作用域之间可以通过scope 连接;从而子作用域中可以访问父作用域中的变量。return返回的函数是再函数外部调用,
所以 外部可以访问内部

6.垃圾回收机制的认识
没有被引用的对象 数组 或者函数;会被垃圾回收机制 回收;释放空间;

7.从内存角度谈谈你对闭包的认识
因为 闭包中返回的函数 被全局变量所引用;所以导致 函数中变量不会释放,内存泄露;
可以通过;标记清除发;以及立即执行函数方式 解决这个问题

8.如何将一个类数组变为真数组?请写出 2中方法
1: 结构赋值 …
2: Array.from()
3: for循环遍历

9.什么是递归呢?递归的弊端但是什么?
递归:函数内部 自己调用自己
不断:最先执行的最后输出;需要找出出口 会导致性能差

10.作用域是什么时候产生的呢?
全局:window对象创建时候
局部:函数执行时候;执行期上下文对象创建时候

11.请说出你判断this 指向的方法是什么呢?
1: 先看 this 在哪个做作用域中?
全局—> this = window
箭头函数—> 看上一层作用域中中this
function 函数体中。
2:看函数执行。
2.0: 判断哪一个函数被执行?再看方法体中 this 指向谁?
2.1 看是否有call apply bind ,有—> 参一是谁 this 就指向谁
2.2 看是否是事件处理函数; 是----> 触发事件元素
2.3 调用函数是否是new 是构造函数,this 指向new 实例的对象
2.4 以上都不满足。谁调用指向谁。

12.谈谈你对原型 原型链 继承的认识
原型:JS在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__的内置属性,用于指向创建它的函数对象的原型对象prototype 。 每个对象都有原型对象;null 除外
原型链:有__proto__串起来的直到Object.prototype.__proto__为null的链叫做原型链。
继承,原型对象中属性是通过原型链继承的;对象可以执行访问继承的所有的原型对象中的属性。

13.Function与 function的区别是什么
Function 是 functiohn 的构造函数 都是函数对象
function 的 原型对象为 普通对象
Function 的原型对象为 函数对象;但是 这个函数对象没有原型对象了

14.什么是异步?
异步:执行慢额程序 放在异步中。
异步:非阻塞代码执行。当满足执行条件后;才执行这个代码

15.什么是回掉函数
回掉函数:将一个函数作为参数传入到另一个函数中。那么即是callback

16.请说一下你是如何理解 js 是解析型语言的
语言分析
预编译 GO AO
解析执行

17.执行期上下文
函数执行时,会创建一个称为执行期上下文的内部对象,一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,执行上下文被销毁。

18.call apply bind 的区别
相同点:都会改变 触发的function 函数;函数体中 this 执向
bind() 需要执行符触发函数 .bind()()
apply() 两个参数;参二 为数组;给触发函数传入实参
call() n个参数 参二以后都是给触发函数传入实参

19.变量的使用规则
先再自己的作用域中找看是否有 var 或者其他方式声明这个变量 如果没有 往祖籍域中找。直到找到距离最近的 声明的变量;并使用最近的一次赋值。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值