执行环境和作用域

一.全局变量和局部变量

每个执行环境都有与之关联的变量对象(变量和函数存储在这里),全局执行环境是最外围的执行环境,根据ECMA实现所在的宿主不同,表示的执行环境的对象也不同。在web浏览器中,全局执行环境被认为是window对象。

每个函数都有自己的执行环境,有自己对应的变量对象(arguments对象),当执行流进入一个函数时,函数的环境会被推进一个环境栈,函数执行完后,栈将其环境弹出,把控制权交给之前的执行环境。

当代码在一个环境执行的时候,会创建变量对象的作用域链。

二.延长作用域链(有点不理解延长?)

try-catch中的catch(IE8前catch捕获的错误对象被存在了执行环境的变量对象中,而不是catch语句的变量对象中,IE9修复了这问题)

with语句:

(function addUrl(){

var qs="?a=4";

with(location){

console.log("href : "+href);

//访问location的属性成功

var url=href+qs;

}

//console.log("href : "+href);

//访问location的属性失败

console.log("url : "+url);

})();

//with的变量对象中包含了location对象的所有属性和方法,这个变量对象被添加到了作用域链前端,而location的属性和函数只能在with的作用域内访问,在with之外的addUrl函数访问不到,但with之外的addUrl函数可以访问到with内新建的变量url。

(这里和“没有块作用域”的知识有矛盾,因为这里的with里面的location属性在with外面访问不到,所以with内部本身有变量对象,但是下面的知识点又提及到语句没有块作用域)

(严格模式下不允许使用with , with大量使用会影响性能)

三.没有块作用域

if else , for 等语句定义的变量会存放在最近的执行环境中,本身没有执行环境。

使用var声明的变量会自动被添加到最近的执行环境。

标识符的查询是由近到远。

内存

一.自动的垃圾收集机制

垃圾收集器会按照固定的时间间隔周期性地找出那些不再继续使用的变量,然后释放其占有的内存。

有两种方式:

标记清除(最常用,标记的方式有很多,原理一样);

引用计数(容易造成循环引用,特别是IE8及其以下的js的COM对象!);

二.管理内存

出于安全考虑,一般计算机系统分配给wed浏览器的内存数量比桌面应用程序少,所以要在有限的内存里达到更好的性能,就可以使用解除引用的方式,此时解除一个值的引用不是说自动收回所占用的内存,而是让值脱离执行环境以便垃圾收集器下次运行的时候回收。

【js】性能问题的更多相关文章

  1. js性能优化-事件委托

    js性能优化-事件委托 考虑一个列表,在li的数量非常少的时候,为每一个li添加事件侦听当然不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(当然只是一个解释,实际工作中很少 ...

  2. 客户端JS性能的一些优化的小技巧

    下面是一些关于客户端JS性能的一些优化的小技巧:1.[顶]关于JS的循环,循环是一种常用的流程控制.JS提供了三种循环:for(;;). while().for(in).在这三种循环中 for(in) ...

  3. js 性能基准测试工具-告别可能、也许、大概这样更快更省

    平时写js经常遇到这样做是不是更快点?但又没有具体简单可测试的工具,最近也倒序看博客园司徒正美 js分类下的文章 [ps:去年灵光一闪,发现看博客园排名前100的博客.按照文章分类倒序看是学习最快的方 ...

  4. js性能的进阶

    为了说明js性能方面的差异用一个简单的例子说明下, <style> #ul1{ padding: 5px; overflow: hidden; } #ul1 li{ list-style: ...

  5. 你不知道的Node.js性能优化,读了之后水平直线上升

    本文由云+社区发表 "当我第一次知道要这篇文章的时候,其实我是拒绝的,因为我觉得,你不能叫我写马上就写,我要有干货才行,写一些老生常谈的然后加上好多特技,那个 Node.js 性能啊好像 D ...

  6. js 性能优化利器:prepack

    1. js 性能优化 js 本身是没有像 python 一样的预编译功能,更没有像 java 一样的编译功能,所以,这里所说的 js 代码预编译 只是通过工具实现的类似功能而已. 这就要提到 prep ...

  7. js 性能优化 篇一

    JS性能优化 摘自:http://www.china125.com/design/js/3631.htm  首先,由于JS是一种解释型语言,执行速度要比编译型语言慢得多.(注:,Chrome是第一款内 ...

  8. js性能优化文章集锦

    总结的js性能优化方面的小知识http://www.it165.net/pro/html/201503/35336.html 如何优化你的JS代码http://www.php100.com/html/ ...

  9. web优化 js性能高级篇

    今天我们继续上一个阶段关于web的性能优化,如何对js高级进行优化 (1)闭包 何为闭包; 一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.  我认 ...

  10. 关于js性能

    1,声明变量要赋初值2,尽量避免声明全局变量,可以减少与系统的重名3,当编写大量js代码时,难免会遇到命名冲突,这是可以通过模拟命名空间方式     来避免冲突4,尽量避免使用全局变量,搜索全局变量是 ...

随机推荐

  1. js模块化开发——require.js学习总结

    1.为什么使用require.js 作为命名空间: 作为命名空间使用: 异步加载js,避免阻塞,提高性能: js通过require加载,不必写很多script 2.require.js的加载 requ ...

  2. DataTimePicker

    日期时间控件 DataTimePicker 功能:拾取系统时间.日期,并以对应格式输出 重要属性: a. date,拾取的时间.  b. Time,拾取的系统时间 举例如:button2.Captio ...

  3. 数组(Array)资源

    上面的程序中在Java代码中定义了两个数组,Android并不推荐在Java代码中定义数组,因为Androd允许通过资源文件来定义数组资源. Android采用位于/res/values目录下的arr ...

  4. Stanford机器学习课程之一——引言

    Andrew Ng的Machine Learning课程,在网易公开课上有中文版视频http://v.163.com/special/opencourse/machinelearning.html,六 ...

  5. Java中的集合类型的继承关系图

    Java中的集合类型的继承关系图

  6. Collections.sort的两种用法

    http://gwh-08.iteye.com/blog/1233401/ class Foo implements Comparable<Foo>{ @Override public i ...

  7. HoloLens开发手记 - 构建2D应用 Building 2D apps

    HoloLens可以让我们在真实世界中看到全息图像内容.但是它本质上还是一台Windows 10设备,这意味着HoloLens可以以2D应用形式运行Windows Store里的大部分UWP应用. 目 ...

  8. 导入礼包时,遇到file_get_contents读取的文本,去除空格、换行等的方法

    解决方法:正则替换: 代码:$gift_code_str = preg_replace('/((\s)*(\n)+(\s)*) /i ',',',file_get_contents($gift_cod ...

  9. Spring AOP中的动态代理

    0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  Spring AOP中的动态代理机制 2.1  ...

  10. MySQL 存储表情字符

    摘要 在 MySQL 中直接存储表情的时候,会出现无法插入数据的错误. 这是由于一般情况下,MySQL 的字符集是 utf8,而对于 emoji 表情的 mysql 的 utf8 字符集是不支持,需要 ...