美文网首页
JS引用类型之Function和单体内置对象

JS引用类型之Function和单体内置对象

作者: 7天苹果 | 来源:发表于2017-08-06 13:03 被阅读12次

    函数实际上是对象。每个函数都是Function类型的实例,函数名实际上也是一个指向函数对象的指针。

    Function


    函数定义

    1、函数通常是使用函数声明语法定义的,如下所示:

    function sum(num1,num2){
      return num1+num2;
    }
    

    2、定义变量并将其初始化为一个函数。

    var sum = function(num1,num2){
      return num1+num2;
    };
    

    注意:函数末尾有一个分号,就像声明其他变量一样。

    3、使用Function构造函数。

    var sum = new Function("num1","num2","return num1+num2");
    

    不推荐使用这种方法,因为这种语法会导致解析两次代码

    没有重载

    将函数名想象为指针。

    function addSomeNumber(num){
      return num+100;
    }
    
    function addSomeNumber(num){
      return num+200;
    }
    
    var result = addSomeNumber(100);
    

    这个例子中声明了两个同名函数,而结果则是后面的函数覆盖了前面的函数。以上代码实际上与下面的代码没有什么区别。

    var addSomeNumber = function(num){
      return num+100;
    };
    
    addSomeNumber = function(num){
      return num + 200;
    };
    
    var result = addSomeNumber(100);  //300
    

    在创建第二个函数时,实际上覆盖了引用第一个函数的变量addSomeNumber。

    函数声明与函数表达式

    函数声明与函数表达式的区别:解析器会率先读取函数声明,并使其在执行任何代码之前可用;至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。

    alert(sum(10,10));
    
    function sum(num1,num2){
      return num1+num2;
    }
    

    以上代码完全可以正常运行。

    而如果写成函数表达式的形式则会出错:

    alert(sum(10,10));
    
    var sum = function(num1,num2){
      return num1+num2;
    }
    

    函数内部属性

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

    arguments:它是一个类数组对象,包含着传入函数中的所有参数,这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。
    在阶乘函数中使用callee属性,可以避免与执行函数名的耦合。

    function factorial(num) {
      if(num <= 1){
        return 1;
      }else{
        return num * arguments.callee(num-1);
      }
    }
    

    this:引用的是函数执行的环境对象。
    caller:ECMAScript5也规范了另一个函数对象的属性,caller。这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为null。

    函数属性和方法

    每个函数包含两个属性:length和prototype,其中,length属性表示函数希望接收的命名参数的个数。

    function sayName(name){
      alert(name);
    }
    function sum(num1,num2){
      return num1+num2;
    }
    function sayHi(){
      alert("hi");
    }
    alert(sayName.length);   //1
    alert(sum.length);       //2
    alert(sayHi.length);     //0
    

    prototype:保存它们所有的实例方法。prototype属性不可枚举。
    每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。它们的作用相同,区别仅在于接收参数的方式不同。

    单体内置对象


    定义:由ECMAScript实现提供的、不依赖宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。比如:Object、Array和String。还有两个单体内置对象:Global和Math。

    Global对象

    所有在全局作用域中定义的属性和函数,都是Global对象的属性。除此之外,Global对象还包含其他一些方法。

    1、URI编码方法
    encodeURI():主要用于整个URI,不会对本身属于URI的特殊字符进行编码。
    encodeURIComponent():主要用于对URI中的某一段进行编码,会对它发现的任何非标准字符进行编码。

    var uri = "http://www.wrox.com/illegal value.htm#start";
    
    //"http://www.wrox.com/illegal%20value.htm#start"
    alert(encodeURI(uri));
    
    //"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start"
    alert(encodeURIComponent(uri));
    

    使用encodeURI()编码后的结果是除了空格之外的其他字符都原封不动,只有空格被替换成了%20。而encodeURIComponent()方法则会使用对象的编码替换所有非字母数字字符。

    与encodeURI()和encodeURIComponent()方法对应的两个方法分别是decodeURI()和decodeURIComponent()。

    2、eval()方法
    它就像是一个完整的ECMAScript解析器,它只接收一个参数,即要执行的ECMAScript字符串。

    eval("alert("hi")");
    等价于
    alert("hi");
    

    在eval()中创建的任何变量或函数都不会被提升,因为在解析代码的时候,它们被包含在一个字符串中;它们只在eval()执行的时候创建。

    3、Global对象的属性

    Global对象的属性

    4、window对象

    在全局作用域中声明的所有变量和函数,就是window对象的属性。

    var color = "red";
    function sayColor(){
      alert(window.color);
    }
    window.sayColor();   //"red"
    

    Math对象

    1、min()和max()方法

    var max = Math.max(3,2,4,5,7);
    alert(max);    //7
    
    var min = Math.min(3,45,7,1);
    alert(min);    //1
    

    要找到数组中的最大或最小值,可以使用apply()方法:

    var values = [1,2,3,4,5,6,7,8];
    var max = Math.max.apply(Math,values);
    

    2、舍入方法
    将小数舍入为整数的方法:

    Math.ceil():向上舍入
    Math.floor():向下舍入
    Math.round():标准舍入
    

    3、random()方法
    Math.random()方法返回大于等于0小于1的一个随机数。
    如果你想选择一个1到10之间的数值,可以这样:

    var num = Math.floor(Math.random() * 10 + 1);
    

    如果选择一个2到10之间的数:

    var num = Math.floor(Math.random() * 9 + 2);
    

    4、其他方法

    其他方法

    相关文章

      网友评论

          本文标题:JS引用类型之Function和单体内置对象

          本文链接:https://www.haomeiwen.com/subject/mbsglxtx.html