浅析JavaScript中Function对象

Posted 天天向上吧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析JavaScript中Function对象相关的知识,希望对你有一定的参考价值。

  一、Function对象及其原型对象

  Function对象是js中一个非常重要的对象,所有通过function关键字声明的函数,本质上都是由Function这个特殊的构造器对象创建出来的,也就是new出来的。

  首先要明确的一点就是,在JS中万物皆对象,所以函数本身也是对象,只不过函数对象比较特殊,比其他对象多一个prototype属性。所以Function既是对象,也是函数(构造器),其实更准确的说就是函数对象。

  其次,更特殊的一点是,由于js中所有的对象都是由构造器new出来的,那么Function既然也是个对象,那么它又是由谁构造出来的呢?这个答案我们可以考察它的prototype和__proto__属性就能得出答案。

console.log(Function.prototype == Function.__proto__);//true

  也就是说,Function函数的prototype和__proto__指向的是同一个对象,换句话说就是Function自己构造了自己。到了这里,其实就成了“蛋”和“鸡”的关系了。到底是先有鸡还是先有蛋?这是个问题,但也不是问题,对于我们开发人员来说,我们压根没必要在这个问题上纠结,因为这个问题丝毫不会影响我们开发项目。我们这需要知道有这么一个扯淡的事情就OK了。

  二、arguments

  其实arguments有2个,惊喜不惊喜,以外不意外?

  1.arguments属性

  其语法是:function.arguments 属性:代表传入函数的实参,它是一个伪数组对象。已废弃。

function test(var1,var2){
    console.log(test.arguments[0]+test.arguments[1]);
}

  注意: 1)、使用函数名调用;2)、arguments数组访问的是本次函数调用时传入的实参,而非上一次调用时的参数(对于嵌套或循环调用需注意!)。推荐使用函数内部的arguments对象:。

  2.arguments对象

  该对象是函数内部的本地变量,而不是函数的属性。使用示例

function test(var1,var2){
    arguments[0]=0;//可改变参数的值
    alert(arguments[0]+arguments[1]);
}
test(1,2);//将提示结果为2

  arguments对象并不是一个真正的Array对象,而是一个伪数组,所以它没有数组的属性与方法(length除外)。

  arguments对象的主要成员有:arguments.callee,arguments.length。

  ①arguments.callee返回该arguments对象所属的函数构造器(即函数),从而可实现匿名函数的递归等 ,例如

function create() {
   return function(n) {
      if (n <= 1)
         return 1;
      return n * arguments.callee(n - 1);//调用该arguments所属的匿名函数构造器。
   };
}
var result = create()(5); // returns 120 (5 * 4 * 3 * 2 * 1)

  ②arguments.length : 返回函数被调用时实际传参的个数。

  来个小例子来说下arguments的用处吧,比如我们封装一个$(selector){}函数,用来获取DOM对象,要求这里的selector能使用各种合法的选择器,比如:"div",“.hide",”#btn"。那么我们可以这么写:

  function $(selector) {  
        if(arguments.length != 1){
            throw new Error("当前参数为: " + arguments.length + "个,但是函数要求必须为1个参数."); 
        }
        if(selector.length > 0){
            var firstChar = selector.substr(0,1);// [#|.|tag]
            var lastString = selector.substr(1);
            switch(firstChar){
                case "#":
                    return document.getElementById(lastString);
                case ".":
                    return document.getElementsByClassName(lastString);
                default:
                    document.getElementsByTagName(selector);
            }
        }        
    }

  我们首先要判断用户有没有传递参数,如果没有或者参数超过一个就要报错,那么如何判断用户传递的参数的个数呢?这时候arguments.length就派上用场了。

  三、length属性

  此length属性表示声明的函数的形参个数。

  上面说了,在函数内部可以使用arguments对象,arguments对象有一个length属性。

  其实每一个function对象自己本身也有一个length属性,这个length属性是函数对象的一个属性值,指明该函数期望多少个参数,意即形参的个数。

  四、方法成员:call()   、 apply() 、bind()

  这三个是一个比较难理解的部分,我们放在下一个专题来分析。

以上是关于浅析JavaScript中Function对象的主要内容,如果未能解决你的问题,请参考以下文章

Javascript自执行匿名函数(function() { })()的原理浅析

JavaScript arguments对象浅析

浅析 var that = this;

JavaScript (JS) 面向对象编程 浅析 (含对象函数原型链解析)

JavaScript运行机制浅析

JavaScript浅析ajax的使用