• JavaScript引用类型(二)


    Date类型

    Javascript中的Date类型是采用Java中的java.util.Date类基础上构建的,使用UTC时间来保存数据,可以精确到1970年1月1日之前或之后的285616年

    创建一个日期对象,使用new关键字加构造函数声明(日期对象也是引用类型的),在不给构造函数传递任何参数的情况下,新对象自动获取当前的日期和时间,如下:

    var nowTime=new Date();
    document.write(nowTime); //ed Aug 27 2014 13:31:12 GMT+0800 (中国标准时间)

     有两个方法可以根据特定的日期和时间来创建日期对象:Date.parse()和Date.UTC()

    Date.parse():分析一个包含日期的字符串,并返回该日期与 1970 年 1 月 1 日午夜之间相差的毫秒数。

            var dateString="November 1, 1997 10:15 AM"
            var mSec = Date.parse(dateString);
            document.write(mSec);
            // Output: 878404500000

    Date.parse() 函数返回一个整数值,此整数表示 dateVal 中所提供的日期与 1970 年 1 月 1 日午夜之间相差的毫秒数。

    Function类型

    Javascript中最有意思的莫过于函数了,在Javascript中函数实际上是对象,每个函数都是Function类型的一个实例

    而且与其他引用类型一样具有属性和方法。由于函数式对象,所以函数名实际上也是一个指向函数对象的指针,不会与

    某个函数绑定

    函数定义语法有三种:

    方法一:函数声明

            function functionName([argname1  [, ...[, argnameN]]])
            {
                return argname1+...+argnameN;
            }

    方法二:函数表达式定义法

            var sum=function([argname1  [, ...[, argnameN]]]){
                return argname1+...+argnameN;
            };

    在这个方法中function关键字后面没有函数名,因为此时可以通过变量sum访问到该函数,就没有必要再加上函数名,最后要像变量定义一样在函数末尾加个分号 

    方法三:构造函数法

    var sum=new function("argname1","...","argnameN","return argname1+...+argnameN");

    这种方法更利于理解:“函数式对象,函数式指针”概率,它使用function构造函数来创建函数,function构造函数可以接受任意个参数,最后一个参数被看成是函数体,前面的参数表示函数参数;这种语法的缺点是:导致代码两次解析,第一次解析常规的ECMAscript代码,第二次解析传入构造函数中的字符串

    回到之前,由于函数式对象,所以函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没有什么不同,也就是说一个函数可以有多个函数名,请看下面的示例:

            function sum(num1,num2,num3){
                return num1+num2+num3;
            }
            document.write(sum(10,20,30));   //Output:60
            var anotherSum=sum;   //注意这里的sum函数不能带圆括号,否则变成了调用函数了
            document.write(anotherSum(100,200,300)); //Output:600
            anotherSum=null; //让another与函数断绝关系
            document.write(anotherSum(100,200,300)); //无输出

     Javascript函数的特殊性决定了它不像传统编程语言那样:函数重载,在Javascript中函数是没有重载的。

    //没有重载
            function sum(num1,num2,num3){
                return num1+num2+num3;
            }
            function sum(num1,num2,num3){
                return num1*num2*num3;
            }
            document.write(sum(100,200,300));   //Output:6000000

    虽然上面两个函数名称相同,但结果是最后一个函数覆盖了前面一个同名函数

    函数声明与函数表达式的区别:

    前面介绍了函数的定义方法有三种:函数声明、函数表达式、new加构造函数,但是解析器在处理函数声明和函数表达式两种时是区别对待的

    函数声明法:解析器先读取函数声明,并使其在执行任何代码之前都可以访问到

            document.write(sum(110,120,119));   //Output:1570800
            function sum(num1,num2,num3){
                return num1*num2*num3;
            }

    这段代码完全正确,能够正常运行的,因为在执行之前,解析器读取并将函数声明添加到执行环境中;在对代码求值时Javascript引擎在第一次会声明函数并且将它们放到源代码树的顶部,也就是说即使声明函数的代码在调用它的代码之后,Javascript引擎也能把函数声明提升至顶部,相反对于函数表达式法定义的函数,则会导致执行错误

            document.write(sum(110,120,119));  
            var sum=function(num1,num2,num3){
                return num1*num2*num3;
            };

    【把函数当做值传递】

    函数是对象,函函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没有什么不同,所以函数也可以当做值来使用,也就是说可以像传递参数一样把函数传递给另一个函数,并且可以把函数作为另一个函数的参数返回

            function callSomeFunction(someFunction,someArgument){
                return someFunction(someArgument);
            }

    这个函数接受两个参数,第一个参数表示函数,第二个是普通参数

    【函数的内部属性】

     在Javascript函数内部有两个特殊的对象:arguments和this

    arguments对象:保存所有传入函数中的参数,它是一个数组对象,这个对象有一个callee属性,它是一个指向拥有arguments对象的函数,利用它可以解决函数和函数名的耦合问题。先看下面的阶乘代码:

     //阶乘函数
            function factorial(num){
                if(num<=1){
                    return 1;
                }else{
                    return num*factorial(num-1);
                }
            }

     上面代码在函数的执行中,函数名和函数紧紧耦合在一起。

     //阶乘函数
            function factorial(num){
                if(num<=1){
                    return 1;
                }else{
                    return num*arguments.callee(num-1);
                }
            }

     变更之后,就可以消除函数和函数名的关联了。因为每个函数都有arguments对象,而这个对象,又拥有callee方法,用它来指定拥有arguments对象的函数

    现在可以这样调用函数:

            var trueFactorial=factorial;  //把factorial函数的指针,保存一份到trueFactorial变量中
            factorial= function () {      //重写原函数factorial函数的功能
                return 0;
            };
            document.write(trueFactorial(10));  //Output:3628800
            document.write(factorial(10));   //Output:0

     重写之后,原函数名,无法执行到原来函数的功能了,而用新函数名则可以,这样的话,就使函数和函数名的耦合取消了

    Javascript中另一个对象是this,它的含义很多,它可以是全局对象、当前对象或者任意对象,this到底绑定到哪里?这完全取决于函数的调用方式。JavaScript 中函数的调用有以下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用 apply 或 call 调用(参考:http://www.ibm.com/developerworks/cn/web/1207_wangqf_jsthis/)

    函数作为对象的方法调用:

    在Javascript中函数也是对象,因此函数可以作为一个对象的属性,这时该函数被称为对象的方法,使用这种调用方式是,this被自然绑定到拥有函数的对象上

     1        var point={
     2             x:10,
     3             y:10,
     4             moveTo:function(x,y){
     5                 this.x=this.x+x;
     6                 this.x=this.y+y;
     7             }
     8         };
     9         
    10         point.moveTo(10,10)

    这里定义一个对象,该对象point具有属性x,y,同时有一个moveTo方法。这个时候函数被当做方法调用,this关键字,就是代表这个对象,即this=point 改写成以下方式也完全正确

     1         var point={
     2             x:10,
     3             y:10,
     4             moveTo:function(x,y){
     5                 point.x=point.x+x;
     6                 point.y=point.y+y;
     7             }
     8         };
     9 
    10         var result=point.moveTo(10,10);
    1  window.color="red";
    2         var o={color:"Blue"};
    3         //printColor()是在全局作用域中定义的
    4         function printColor(){
    5             document.write(this.color);
    6         }
    7         printColor(); //在全局作用域中调用函数,则this代表了window
    8         o.printColor=printColor //把函数给了对象
    9         o.printColor();//此时this引用的是o.color

    作为函数调用

    当函数被直击调用时候,this被绑定到全局对象,在浏览器中window就是该全局对象

    1         function makeNoSense(x){
    2             this.x=x;    //这个x本来是局部变量,但是当函数被直接调用的时候,x就变成了全局变量
    3         }
    4         makeNoSense(100);   //x已成了一个值为100的全局变量

    关于内部函数的绑定

     1         var point={
     2             x:10,
     3             y:10,
     4             moveTo:function(x,y){
     5                 //声明在函数MoveTo内部的内部函数
     6                 var moveX=function(x){
     7                     this.x=x;
     8                 };
     9                 //声明在函数MoveTo内部的内部函数
    10                 var moveY=function(y){
    11                     this.y=y;
    12                 };
    13                 moveX(x);
    14                 moveY(y);
    15             }
    16         };
    17         point.moveTo(10,10);
    18         point.x;
    19         point.y;
    20         x;
    21         y;

     函数的属性和方法

    Javascript中函数式对象,既然是对象,那么它就有属性和方法,每个函数都包括两个属性:length和prototype

    length:希望接受命名参数的个数

    prototype:保存所有实例方法

     1  //函数的length属性
     2         function printName(name){
     3             document.write(name);
     4         }
     5         function sum(num1,num2,num3){
     6             return num1*num2*num3;
     7         }
     8 
     9         function sayHi(){
    10             document.write("Hello JavaScript!");
    11         }
    12 
    13         document.write(printName.length);  //Output: 1
    14         document.write(sum.length);        //Output: 3
    15         document.write(sayHi.length);      //Output: 0

    this对象:引用函数据以执行的环境对象

  • 相关阅读:
    Web开发四大作用域(转)
    jsp与servlet(转)
    使用jsp,tomcat实现用户登录注册留言的代码
    java环境变量的配置
    JSP 九大内置对象(转)
    http协议头文件的控制信息(转)
    javaScript实现图片滚动及一个普通图片轮播的代码
    javaScript显示实时时间输出
    javaScript判断输入框是否为空
    1072 威佐夫游戏
  • 原文地址:https://www.cnblogs.com/tao-zi/p/3939239.html
Copyright © 2020-2023  润新知