《高性能javascript》学习笔记二

二、数据的读取速度

1、四种读取数据方式的比较

字面量、局部变量、数组元素、对象元素是常见的四种数据(并非严格意义上的数据类型,而是代码中常见的、按照读取方式分类的四种数据类型)。

字面量(书中应该指Array、Object、Math等,这和全局变量有所区别。这些内置的对象是绑定在js环境内的)、局部变量读取速度最快,访问对象成员和数组成员更慢。

2、作用域与作用域链的分析

es6中出现了块级作用域,之前只有局部作用域(也称函数作用域)和全局作用域。js代码的在执行时,当前作用域会创建一个执行环境(即上下文环境,也就是我们常见的this)。作用域每次执行时创建的执行环境都是独一无二的,执行完就销毁该执行环境。代码在作用域内执行时,会创建一个活动对象,该活动对象包含当前声明在该作用域内的所有局部变量以及this,然后将这个活动对象推入作用域的最前端。该作用域内的代码在读取数据时,首先就会读取当前作用域的活动对象的数据,如果没有则沿着作用域链往外部作用域查找。

显然,作用域链每往上一层,消耗的性能更多。一个数据所在作用域链的位置越深(离当前作用域越远),读写速度也就越慢。全局变量位于作用域链最末端,读取最耗性能。

3、如何改变作用域链

(1)with:不推荐使用,已废弃该api,

(2)try catch:try catch一般用来捕获代码错误。在浏览器抛出异常时,catch捕获改异常,然后创建一个一场对象推入作用域链最前端。

4、闭包带来的问题

闭包功能很强大,但是也带来了一些问题。

在闭包执行时,一个活动对象创建出来,由于闭包内部包含了其他方法的引用,所以执行完代码之后,闭包创建的那个活动对象并没有销毁。这使得闭包需要更大的内存开销。

5、对象数据的读取

js中的对象是基于原型的,简单来说,读取一个数据的属性,如果在该对象上没找到,会在它的原型上找,原型上没找到,会在它的原型的原型上找......直到Object.prototype。

如果需要读取的数据在对象上嵌套多层,如object.abc.ccc,aaa,,,,,,,消耗的性能也会很大

和作用域链类似的问题,每沿原型链往上找一层,都会额外消耗性能。

扫描二维码关注公众号,回复: 3355428 查看本文章

6、良好的代码习惯(性能角度)

(1)使用局部变量。如果一个变量在外层作用域或者嵌套在对象内,且需要多次读取,可以在当前作用域声明一个局部变量保存,避免重复取值,造成不必要的性能开销。

经典的就是for循环中的数组长度。

在第一种写法中,在for循环的初始语句声明了一个变量保存了数组的长度,后续每次循环执行都是直接读取length变量,而不是读取data.length。

(2)避免使用with

猜你喜欢

转载自blog.csdn.net/weixin_42733155/article/details/82847099