首页 > 代码库 > 数据访问---高性能JavaScript读书笔记(2)
数据访问---高性能JavaScript读书笔记(2)
对于任何一种编程语言来说,数据存储的位置关系到访问速度!
在JavaScript中的直接量包括字符串string、数字number、布尔值boolean、对象object、数组array、函数function、正则表达式regular expression、空值null、未定义数组undefined。而数组项则需要通过数组的数字索引来访问,对象通过字符串进行索引来访问其成员(这里顺便提一句因为数组项是通过数字进行索引、对象成员是通过字符串进行索引,所以这也就是为什么访问对象成员比访问数组项更慢的原因)。
总结一句话就是说直接量和局部变量的访问速度要远已于数组项和对象成员,所以我们应该尽量使用直接量和局部变量,尽量限制使用数组项和对象成员。
了解过JavaScript原型链和闭包的都知道在JavaScript中每个函数事实上就是对象,每个函数内部都会有一个Scope属性,这个属性包含被创建的作用域中对象的集合,所以事实上内部Scope属性就是函数的作用域。在函数运行时,会建立一个运行期上下文(运行期上下文事实上就是函数运行时的环境,对于函数的每次运行而言,运行期上下文都是独一的,函数执行完毕运行期上下文将被销毁,也就是说多次运行同一个函数就会创建多个运行期上下文)。
当函数运行期上下文确定后,它的作用域将被初始化(作用域初始化包括函数参数、函数内部变量、this),作用域初始化之后将被作为激活对象推入作用域链的前端。(事实上这就是原型链的原理,js就是通过原型链来实现继承,通过闭包来实现成员的公有和私有),这也是为什么访问全局变量是最慢的,因为全局变量它是处于运行期上下文作用域链的最后一个位置。
1、如果需要多次访问全局变量,尽量使用局部变量来保存它(我觉得这条规则运用在哪种编程语言中都适用)
2、尽量少去改变作用域链
- 使用with
- try catch
我了解到的JavaScript中改变作用域链的方式只有两种1)使用with表达式 2)通过捕获异常try catch来实现
但是with是大家都深恶痛绝的影响性能的表达式,因为我们完全可以通过使用一个局部变量的方式来取代它(因为with的原理是它的改变作用域链的同时需要保存很多信息以保证完成当前操作后恢复之前的作用域链,这些就明显的影响到了性能)
try catch中的catch子句同样可以改变作用域链。当try块发生错误时,程序自动转入catch块并将异常对象推入作用域链前端的一个可变对象中,也就是说在catch块中,函数所有的局部变量已经被放在第二个作用域链对象中,但是catch子句执行完成之后,作用域链就会返回到原来的状态。应该最小化catch子句来保证代码性能,如果知道错误的概念很高,我们应该尽量修正错误而不是使用try catch
3、尽量少去使用闭包
众所周知,闭包最厉害的地方就是允许函数使用局部范围之外的数据。
大家知道当函数运行完成之后,其运行期上下文就将被销毁,当涉及闭包的时候,它就不能被销毁,因为可能它还需要被函数引用,这样无形中就需要更多的内存开销。
4、访问速度与成员嵌套深度有关(成员嵌套越深访问速度越慢)
location.href快于window.location.href
window.location.href快于window.location.href.toString()
5、缓存变量的值(事实上就是如果需要访问全局变量或者多次访问具有深度的对象成员,使用局部变量将其保存下来以方便后续使用)
这是我看高性能JavaScript的一点总结,希望对前端感兴趣的可以与我共同研讨!
数据访问---高性能JavaScript读书笔记(2)