zoukankan      html  css  js  c++  java
  • 高性能JS笔记2——数据存取

    数据存取性能而言:

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

    一、标识符解析的性能

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

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

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

    二、改变作用域链

    作用域链运行后一般不会改变的,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。对象访问成员越深,读取速度也就越慢。

    九、缓存对象成员值

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

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

  • 相关阅读:
    对称加密和非对称加密
    数字签名
    内存溢出和内存泄漏
    生产随机字符串
    天才高中生参与斯坦福新研究:在图像压缩上,人类比算法强
    用机器人替代宇航员!日本打造远程操作机器人
    机器人也能拥有“物理直觉”?谷歌这款机器人真是厉害了
    35所高校新设人工智能本科专业 专家:人工智能非孤立专业
    “入职1年,我和做 AI 的同学薪资翻了 2 翻!”
    让机器学会认脸究竟有多少用处
  • 原文地址:https://www.cnblogs.com/windy2008/p/5722803.html
Copyright © 2011-2022 走看看