• ECMAscript二(对象使用)


    ECMAscript二(对象使用)

    1、对象和变量的的作用域

      a.和其他面向对象的语言相比,严格的说来ecmascript并没有静态作用域,对象方法中的子方法为方法的公共作用域的方法,而非静态方法。

      b.this关键字总是指向调用方法的对象,在调用本对象的属性时最好使用this关键字,否则编译器将会把属性当做局部或全局变量查找起引用。

      c.变量作用域的提升

            var name = "jay";
    
            function show() {
                alert(name);
                var name = "boy";
                alert(name);
            }
    
            show();
    View Code

      ECMAScript规范中描述了所有javascript代码都运行在一个执行上下文中.执行上下文在javascript中不是可访问的实体,但了解他们对于全面理解函数和闭包的工作原理是非常重要的.规范中说:

         当控制权转移到ECMAScript的可执行代码时,控制权进入了一个执行上下文.活动的执行上下文逻辑上形成一个栈。栈顶的执行上下文是当前正在运行的执行上下文.

         每一个执行上下文都有一个变量对象。在函数内部定义的所有变量和函数都被添加为这个对象的属性。下面的算法描述了这一过程.

         对于任何形参,在变量对象上添加相应的属性,并把他们的值设为传递给函数的值.

         对于任何函数声明,在变量对象上添加相应的属性,值既为该函数. 如果一个函数声明使用了和形参中任何一个相同的标识符,那么这个属性(指形参)将被覆盖.

         对于任何变量声明,在变量对象上添加相应的属性,初始化他们的值为undefined,不管这些变量在源代码中是怎么样被初始化的.如果一个变量使用与一个已经定义过的属性相同的标示符,那么这些定义过的属性不会覆盖.

      该算法的作用就是所谓的函数和变量声明的提升.请注意,虽然函数作为整体被提升,但变量却只有他们的声明被提升。请注意变量的初始化发生在源代码中变量被定义的地方

     

    2、如何构建对象的私有公共的方法、属性。

      通常我们通过IIFE模块模式将代码组织成模块,编写类库,抽象出公用代码。

      如何定义命名空间抽象相应的模块代码呢,我们参考jquery源码:

      

     (function( window, undefined ) {  
       var jQuery = function( selector, context ) {   // The jQuery object is actually just the init constructor 'enhanced'  
          return new jQuery.fn.init( selector, context, rootjQuery );  
       },  
     
       // Expose jQuery to the global object  
       window.jQuery = window.$ = jQuery;  
    })( window ); 

       //模块模式的主要作用是区分出私有变量/函数和公共变量/函数

            (function ($, undefined) {
    
                //定义mycommon对象
                var MyCommon = {};
                //私有属性
                var _color, _name, _createTime;
                //公共属性
                MyCommon.color = function () { return this.color; }
                //私有方法
                var _showcolor = function () { alert('color'); }
                $.MyCommon = MyCommon;
            })($);

        通过以上方式,我们可以很好的实现封装和基于模块的扩展。

    参考文章:http://developer.51cto.com/art/201304/389494.htm、 http://hi.baidu.com/cqgphper/item/3fb0ed1f965b4381feded5a9、《javascript 高级编程》。

  • 相关阅读:
    POJ3662 Telephone Lines (dijkstra+二分)
    Codeforces Round #618 (Div. 2)A. Non-zero
    Codeforces Round #618 (Div. 2)C. Anu Has a Function
    洛谷P1060开心的金明(滚动数组优化)
    洛谷P1006传纸条
    Spring Boot中以代码方式配置Tomcat
    js常用方法总结(以后遇到再进一步总结)
    localStorage的使用
    巧用Ajax的beforeSend 提高用户体验
    四种会话跟踪技术
  • 原文地址:https://www.cnblogs.com/LiJianBlog/p/ecmascript.html
Copyright © 2020-2023  润新知