数据存取性能而言:

字面量>本地变量>数组元素>对象成员

一、标识符解析的性能

标识符解析是有代价的,一个标识符的位置越深,它的读写速度也就越慢。

局部变量的读写速度是最快的,全局变量在作用域链的最末端,所以尽可能使用局部变量。

如果某个跨作用域的值在函数中被引用一次以上,那么久把它存储到局部变量里。频繁访问跨作用域的标识符时,每次访问都会带来性能损失。

二、改变作用域链

作用域链运行后一般不会改变的,With和 Try-Catch可以在执行时临时改变作用域链,功能模块执行完后,作用域链恢复。

改变作用域链后,访问改变后的对象更快了,但是访问函数内的局部变量变慢了,一般不建议使用。

function initUI(){
var num1 = 0;
with(docuent){
var bd = body,
links = getElementsByTagName("a");
var num2 = num1;
bd.className = "active";
}
}

三、动态作用域

  无论是 With语句还是 try-catch的字句,或者是包含 eval()的函数,都被认为是动态作用域。动态作用域只存在于代码执行过程中,因此无法通过静态分析检测出来。例如:

function ExecuteJS(code){
eval(code);
function subRouting(){
return window;
}
var w = subRouting(); //w 的作用域链?
}
ExecuteJS("var window={};");

因此,只有确实必要时才去使用动态作用域。

四、闭包、作用域和内存

  闭包的[Scope]属性包含了与执行环境作用域链相同的对象的引用,因此会产生副作用。通常来说,函数的活动对象会随着执行环境一同销毁。但引入闭包后,由于引用存在于闭包的[Scope]属性中,因此激活对象无法被销毁,需要更多的内存开销。

  可以遵循对跨作用域变量的处理建议,来减轻闭包对执行速度和内存的影响,将常用的跨作用域变量存储在局部变量中,然后直接访问局部变量。

五、对象成员

  大部分代码是以面向对象风格编写的。对象成员包括属性和方法,函数也是一种对象。当一个被命名的成员引用了一个函数,该成员就被称为一个“方法”,相反,引用了非函数类型的成员就被称为“属性”。

  访问成员的速度要比访问字面量或变量要慢,在有些浏览器中要比数组元素访问还慢。

六、原型

var book = {
title:"High Performance JavaScript",
Publisher:"Yahoo! Press"
};
alert(book.toString());

解析对象成员的过程与解析变量十分相似。当 book.toString()被调用时,会从对象实例开始,搜索名为"toString"的成员。一旦 book没有名为 toString的成员,那么会继续搜索其原型对象,直到找到并执行。

七、原型链

function Book(title, publisher){
this.title = title;
this.publisher = publisher;
}
Book.prototype.sayTitle = function(){
alert(this.title);
};
var book1 = new Book("AAAAAAA", "Yahoo");
var book2 = new Book("BBBBBBBBBBB", "IBM");
book1.sayTitle();
book1.toString();

当访问原型链的对象位置越深,找到它也就越慢,每深入一层性能都会增加。

八、嵌套成员

如: location.href 和 window.location.href。对象访问成员越深,读取速度也就越慢。

九、缓存对象成员值

如果在函数中多次访问一个对象,最好将该对象保存到局部变量中。

请不要在同一个函数里多次查找同一个对象成员,除非它的值改变了。

高性能JS笔记2——数据存取的更多相关文章

  1. JS性能优化——数据存取

    首先,了解几个概念: 字面量:它只代表自身,不存储在特定的位置.JavaScript中的字面量有:字符串.数字.布尔值.对象.数组.函数.正则,以及特殊的null和undefined值 本地变量:使用 ...

  2. 高性能JS笔记3——DOM编程

    一.访问与修改DOM DOM和JS 相当于两个岛屿,访问操作的次数越多,要交的过路费越多,对性能产生很大影响. 减少访问DOM的次数,把运算尽量留在JS端操作. 二.innerHTML 对比 DOM ...

  3. 高性能JS笔记1——加载执行

    一.脚本位置 1.Script标签尽可能放到Body底部,以减少脚本文件下载对整个页面UI渲染的影响. 2.Script标签永远不要紧跟Link标签后面. 二.组织脚本 1.合并多个文件在一个Scri ...

  4. Android 开发笔记 “SharePreference 数据存取”

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  5. 高性能JS笔记4——算法和流程控制

    一.循环 for.while.do while三种循环的性能都没有多大区别.foreach 的性能较其他三种差 . 既然循环没有多大区别,注意循环内的代码控制. 减少迭代次数. 减少迭代工作量. 推荐 ...

  6. 高性能Js—数据存取

    数据存取 JavaScript中四中基本的数据存取位置 字面量:不存于某个变量内 本地变量:var定义的 数组元素 对象成员 字面量.全局变量读取速度 > 数组项.对象成员 .因为局部变量存在于 ...

  7. 《高性能js》读书笔记

    第一章:加载和执行 .浏览器的JavaScript的引擎是编译器层的优化: .当浏览器执行JavaScript代码时,不能同时做其他任何事情(单一进程),意味着 .主流浏览器都允许并行下载JS. .减 ...

  8. 高性能JavaScript(数据存取)

    数据存取分为4各部分 存取位置 作用域及改变作用域 原型以及原型链 缓存对象成员值 存取位置 JavaScript 有4中基本的数据存取位置 字面量:字面量代表自身,不存于特定的位置.比如这个的匿名函 ...

  9. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

随机推荐

  1. SupportV7包中 SwipeRefreshLayout 修改下拉控件的距离

    //修改下拉距离 ViewTreeObserver vto = mCategoryResults.mSwipeRefreshLayout.getViewTreeObserver(); vto.addO ...

  2. 【转载】 IE/Firefox每次刷新时自动检查网页更新,无需手动清空缓存的设置方法

    [参考了别人的文章]我们做技术,经常在写页面的时候需要多次刷新测试,可是浏览器都有自己的 缓存机制,一般CSS和图片都会被缓存在本地,这样我们修改的CSS就看不到效果 了,每次都去清空缓存,再刷新看效 ...

  3. ERB预处理ruby代码

    cucumber.yml 文件可以用erb预处理,这样允许你在cucumber.yml文件中使用ruby代码生成值.所以如果你有几个配置要用相同值时,你可以这样写 # config/cucumber. ...

  4. 互联网金融必须知道:O2O、P2P、MRD、BRD、LBS、PV、UV、KPI、MRD、VP、UED....

    进入互联网的朋友们和身为互联网业内人士,你们知道有多少专业术吗?有时候专业术语也是一种逼格.商业需求文档,市场需求文档,产品需求文档,功能详细说明文档,华丽丽的各种文档你知道吗?用户体验,用户界面,用 ...

  5. 如何查看distirbution agent的执行进度

    在transactional replication troubleshooting的过程中,经常会遇到下面的场景: 客户在发布端执行了一个几百万行的更新,结果导致性能下降. 客户很想知道目前dist ...

  6. Drupal 7.23版本升级笔记

    转载请注明出处:http://blog.csdn.net/panjunbiao/article/details/9860849 今天将尝试将Drupal网站从7.22升级到7.23,下面是升级笔记. ...

  7. 【Spring】利用AOP来做系统性能监控

    需求: 假设已经有了一些类,现在想统计每个方法调用花了多长时间,该怎么做? 思路: 我第一个想法就是去每个方法执行前后记录一下当前的时间戳,然后相减统计到日志. OK,没问题,那么这样做合理吗? 首先 ...

  8. [Node.js] 也说this

    原文地址:http://www.moye.me/2014/11/21/也说this/ 引子 Any sufficiently advanced technology is indistinguisha ...

  9. iOS-多线程-GCD

    一. 名词解释: 1. 进程和线程 进程是指在系统中正在运行的一个应用程序.每个进程之间都是独立的,每个进程均运行在期专用而且受到保护的内存空间中. 线程是指一个进程想要执行任务,就必须要有线程.线程 ...

  10. Jquery:ajax跨域请求处理

    昨天朋友想做个图片懒加载的效果,朋友是前端的,我这边给他提供数据,程序写好了放到服务器上,本地测试访问时却报jquery跨域的问题,于是找度娘了解了一下jquey如何处理,网上有很多参考文章,但没细看 ...