说一下js中函数的一个执行过程?函数有哪些属性?什么时隐式原型什么是显示原型?以及js如何优化内存管理?

概括
  1. 创建函数的执行环境
  2. 复制函数的[[ scopes]]属性中的对象构建起执行环境中的作用域链
  3. 创建函数的活动对象并推入执行环境中作用域链的前端
  4. 执行代码
  5. 销毁执行环境和活动对象(闭包情况下活动对象仍然被引用没被销毁)
1、什么是执行环境?

ans:执行环境定义了变量或函数有权访问的其他数据,每个执行环境都有一个与之关联的变量对象,环境中所有定义的变量和函数都保存在这个对象中。

2、什么是作用域链

ans:当代码在环境中执行的时候,会创建变量对象的一个作用域链。作用域链的作用就是保证执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是这个代码所在环境的变量对象。
**如果这个环境是函数,**则将其活动对象作为变量对象。活动对象最开始只包含一个变量,即arguments对象,这个对象在全局环境中是不存在的。
作用域链的下一个变量对象来自包含环境,全局执行环境的变量对象始终是作用域链的最后一个对象。

3、函数的八大属性: arguments、caller、length、name、prototype、proto、[[FunctionLocation]]、[[Scopes]]

参考:一个普通函数的冷僻属性
JavaScript内部属性/Scope/与作用域链及其性能问题

注意:

  1. [[Scope]]和执行期上下文虽然保存的都是作用域链,但不是同一个东西;[[Scope]]属性是函数创建时产生的,会一直存在;而执行上下文在函数执行时产生,函数执行结束便会销毁
  2. callee和caller的区别
    • fun.caller代表fun的执行环境
    • arguments.callee代表的是正在执行的fun
    • arguments.callee.caller代表fun执行环境,与fun.caller一致(===)
4、prototype和_proto_的区别

参考:彻底理解什么是原型链,prototype和__proto__的区别
ans: 总结:定义对象的时候,都会创建一个_proto_属性,对象的_proto_属性就指向它的构造函数的prototype对象。

function Person(name) {
  this.name = name;
}

var person = new Person('Tom');
console.log(person._proto_ == Person.prototype);  // true
5、隐式原型和显示原型的区别

ans : 对象具有属性_proto_ 称为隐式原型,对象的隐式原型指向构造该对象的构造函数的显示原型。

6、什么是原型?说一下原型链

ans: 参考:【原型和原型链】什么是原型和原型链

  1. 原型
    • 所有引用类型都有一个_proto_(隐式原型)属性,属性值是一个普通对象
    • 所有函数都有一个prototype(原型)属性,属性值是一个普通对象
    • 所有引用类型的_proto_ 属性指向它的构造函数的prototype
  2. 原型链
    • 当访问一个对象的某个属性时,会先在这个对象的本身属性上查找,如果没有找到,则会去它的_proto_ 隐式原型上查找,即它的构造函数的prototype,如果还没有就会在它的构造函数的prototype的_proto_中查找,这样一层一层向上查找就会形成一个链式结构,称为原型链
js的内存管理

参考 : JavaScript内存优化

深入理解js内存机制
js进行内存管理以及垃圾收集时的一个主要问题:分配给Web浏览器的可用内存数量通常要比分配给桌面应用程序少。

ans:优化内存占用的最佳方式,==解除引用:==一旦数据不再有用,将其值设置为null来释放其引用。解除一个值的引用并不意味着自动回收其内存,真正的作用是让值脱离执行环境,以便垃圾收集器下次运行时将其自动回收。
在js中,如何判断哪些对象正在使用中,一个妥协的方法是,看是否仍然存在该对象的引用。(但是js的引用是可以进行转移的,那么就有可能出现某些引用被带到了全局作用域)

如何优化js代码,以进行更好的内存管理
1、善用函数

在开发js代码时,使用一个匿名函数在逻辑代码最外层进行包裹。在最外层函数执行完毕时,js引擎就开始对其中的对象进行检查,不再使用的全局变量也可以随之回收

2、绝对不要定义全局变量

前提:当一个变量被定义在全局作用域中,默认情况下js引擎就不会将其回收销毁。如此该变量就会一直存在于老生代堆内存中,直到页面被关闭。

全局变量带来的问题:

  1. 使变量不易被回收
  2. 多人协作时容易混淆
  3. 在作用域链中容易被干扰
3、手工解除变量引用
4、善用回调
5、良好的闭包管理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值