浅析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()

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

原文地址:https://www.cnblogs.com/ldq678/p/9697153.html

时间: 2024-08-08 16:13:17

浅析JavaScript中Function对象(一)的相关文章

浅析JavaScript中Function对象(二) 之 详解call&amp;apply

函数是js中最复杂的一块内容,其中call() 和 apply()又是重灾区,初学者往往在这个坑里栽倒,这次来分析这2个函数对象的成员 一.函数的角色 在js的体系下,js有3种角色.分别是普通函数.构造器.对象. 1.普通函数 <script type="text/javascript"> function f1(){ console.log('这是个函数'); } </script> 这里声明的f1,它的角色就是个普通函数 2.构造器 <script

全面理解Javascript中Function对象的属性和方法

函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这些属性和方法,这对于理解Javascript的继承机制具有一定的帮助. 属性(Properties) arguments 获取当前正在执行的 Function 对象的所有参数,是一个类似数组但不是数组的对象,说它类似数组是因为其具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length.还有就是arguments对象存储的是实际传递给

JavaScript中的对象

JavaScript对象 JavaScript对象是基本数据类型之一,是复合型数据: JavaScript中几乎所有事物都是做对象: JavaScript的对象是拥有属性和方法的数据: JavaScript 中的对象可以简单理解成"名称:值"对(name:value). JavaScript中的对象分类 1.内建对象: 数据分装对象(object.object.prototype.Number.Boolean.String.Array.Function): 工具类对象(Math.Dat

【转】JavaScript中的对象复制(Object Clone)

JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b.k2 = 4; 如果只想改变b而保持a不变,就需要对对象a进行复制. 用jQuery进行对象复制 在可以使用jQuery的情况下,jQuery自带的extend方法可以用来实现对象的复制. a = {k1:1, k2:2, k3:3}; b = {}; $.extend(b,a); 自定义clone

(转)JavaScript中判断对象类型的种种方法

我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在). 但 type

javascript中Date对象的应用——简易日历的实现

× 目录 [1]效果 [2]HTML [3]CSS[4]JS 前面的话 简易日历作为javascript中Date对象的常见应用,用途较广泛.本文将详细说明简易日历的实现思路 效果演示 HTML说明 使用type=number的两个input分别作为年和月的输入控件,这样在高级浏览器下自带调节按钮 按照周日到周一的顺序进行星期的排列 <div class="box"> <header class='control'> <input id="con

Javascript中的对象和原型(3)

在Javascript中的对象和原型(二)中我们提到,用构造函数创建的对象里面,每个对象之间都是独立的,这样就会降低系统资源的利用率,解决这样问题,我们就要用到下面提到的原型对象. 一 原型对象 原型对象实际上就是构造函数的一个实例对象,和普通的实例对象没有本质上的区别.可以包含特定类型的所有实例的共享属性或者方法.这样,如果我们需要修改所有实例中的属性或者方法,就只需要修改一处,就能够影响到所有实例了.因为原型中的属性和方法是共享的.我们可以看下两个图示:       构造函数方式 原型模式方

JavaScript中RegExp对象

JavaScript中RegExp对象是保存有关正则表达式模式匹配信息的固有全局对象.使用方法: RegExp.property 必选项property 参数是 RegExp 对象的任意一个属性. RegExp 对象不能直接创建,但始终可以使用.在成功的正则表达式查找完成之前,RegExp 对象各属性的初始值如下所示: 属性简写初始值 index-1www.hljmlyfcyy.com lastIndex-1 lastMatch$&空字符串. lastParen$+空字符串. leftConte

javascript中Date对象的应用

前面的话 简易日历作为javascript中Date对象的常见应用,用途较广泛.本文将详细说明简易日历的实现思路 效果演示 HTML说明 使用type=number的两个input分别作为年和月的输入控件,这样在高级浏览器下自带调节按钮 按照周日到周一的顺序进行星期的排列 <div class="box"> <header class='control'> <input id="conYear" class="con-in&q