• javascript面向对象程序设计之浅谈


    1: 变量定义和函数定义是在整个脚本执行之前完成的,而变量赋值是在执行阶段完成的。

    变量定义的作用仅仅是给所声明的变量指明它的作用域,变量定义并不给变量初始值,任何没有定义的而直接使用的变量,或者定义但没有赋值的变量,他们的值都是 undefined。

    函数定义除了声明函数所在的作用域外,同时还定义函数体结构。这个过程是递归的,也就是说,对函数体的定义包括了对函数体内的变量定义和函数定义。

    例:

    alert(a);    //方法体

    alert(b);   //方法体
    alert(c);   //undefined
    var a = "a";
    function a() {}  
    function b() {}
    var b = "b";
    var c = "c";
    var c = function() {}
    alert(a);  //a
    alert(b);  //b
    alert(c);  //方法体

    猜猜这个程序执行的结果是什么?然后执行一下看看是不是跟你想的一样,如果跟你想的一样的话,那说明你已经理解上面所说的了。

    这段程序的结果很有意思,虽然第一个 alert(a) 在最前面,但是你会发现它输出的值竟然是 function a() {},这说明,函数定义确实在整个程序执行之前就已经完成了。

    再来看 b,函数 b 定义在变量 b 之前,但是第一个 alert(b) 输出的仍然是 function b() {},这说明,变量定义确实不对变量做什么,仅仅是声明它的作用域而已,它不会覆盖函数定义。

    最后看 c,第一个 alert(c) 输出的是 undefined,这说明 var c = function() {} 不是对函数 c 定义,仅仅是定义一个变量 c 和一个匿名函数。

    再来看第二个 alert(a),你会发现输出的竟然是 a,这说明赋值语句确实是在执行过程中完成的,因此,它覆盖了函数 a 的定义。

    第二个 alert(b) 当然也一样,输出的是 b,这说明不管赋值语句写在函数定义之前还是函数定义之后,对一个跟函数同名的变量赋值总会覆盖函数定义。

    第二个 alert(c) 输出的是 function() {},这说明,赋值语句是顺序执行的,后面的赋值覆盖了前面的赋值,不管赋的值是函数还是其它对象。

    理解了上面所说的内容,我想你应该知道什么时候该用 function x(..) {…},什么时候该用 var x = function (…) {…} 了吧?

    最后还要提醒一点,eval 中的如果出现变量定义和函数定义,则它们是在执行阶段完成的。所以,不到万不得已,不要用 eval!另外,即使要用 eval,也不要在里面用局部变量和局部方法! 

    2:javascript的构造函数
    例:	function classA()
    	{
          //类成员函数不能直接调用,必须将其赋给一个this变量
          function fnA()
          {
            alert("this is fnA");
          }
          this.A=fnA;
    		{
    			alert(11);
    		}
    	}

    var  test=new classA();     //此时打印出11

    test.A();    //打印this is fnA; 这样就实现了成员函数的调用

    3:

    this 和执行上下文

    <html xmlns="http://www.w3.org/1999/xhtml">

    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

    <title>无标题文档</title>

    <script type="text/javascript">

    var x = "I'm a global variable!";

    function method() {

    alert(x);

    alert(1);

    alert(this.x);

    }

    function class1() {

        // private field

    var x = "I'm a private variable!";

    // private method

    function method1() {

    alert(x);

    alert(2);

    alert(this.x);

    }

    var method2 = method;

    // public field

    this.x = "I'm a object variable!";

    // public method

    this.method1 = function() {

    alert(x);

    alert(3);

    alert(this.x);

    }

    this.method2 = method;

    // 构造函数

    {

    this.method1();                 // I'm a private variable!    确定作用域在class1内部

    // 3

    // I'm a object variable!

    this.method2();                 // I'm a global variable!             确定作用域在class1内部

    // 1

    // I'm a object variable!

    method1();                       // I'm a private variable!    未确定作用域则为顶级作用域

    //2

    // I'm a global variable!

    method2();                       // I'm a global variable!            未确定作用域则为顶级作用域

    //1

    // I'm a global variable!

    method1.call(this);             // I'm a private variable!    call改变执行上下文

    //2

    // I'm a object variable!

    method2.call(this);             // I'm a global variable!     call改变执行上下文

    //1

    // I'm a object variable!

    }

    }

    </script>

    </head>

    <body>

    <script type="text/javascript">

    var o = new class1();

    alert("----------------分割条------------------")

    method();       // I'm a global variable!

    //1

    // I'm a global variable!

    o.method1();    // I'm a private variable!        

    //3

    // I'm a object variable!

    o.method2();    // I'm a global variable!

    //1

    // I'm a object variable!

    </script>

    </body>

    </html>

    原文请见:http://www.cftea.com/c/2008/01/7RNSKPYOSJAGGPCT.asp

  • 相关阅读:
    109 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 05 问题解析--通过一个方法完成学生和专业的双向关联
    108 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 04 问题解析--数组未实例化造成的空指针异常
    107 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 03 编写方法完成学生个数统计功能
    106 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 02 新增属性完成学生信息存储
    105 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 01 新增需求及分析
    session与cookie的区别和联系
    session和cookie的区别
    Web服务器主动推送技术
    webSocket的场景应用
    TCP、Http和Socket 优劣比较
  • 原文地址:https://www.cnblogs.com/xlhblogs/p/2168564.html
Copyright © 2020-2023  润新知