• 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

  • 相关阅读:
    QT4.8.7和VS2010环境搭建及使用
    SQL Server--获取磁盘空间使用情况
    SQL SERVER--DBA 常用到的一些脚本
    MySQL--REPLACE INTO与自增
    MySQL--更新自增列的潜在风险
    MySQL--Skip GTID CAP
    MySQL--MHA与GTID
    MySQL--自增列学习
    MySQL--MHA原理
    MySQL--BNL/ICP/MRR/BKA
  • 原文地址:https://www.cnblogs.com/xlhblogs/p/2168564.html
Copyright © 2020-2023  润新知