`

JavaScript中的函数:函数的apply、call方法和length属性

阅读更多
转:http://www.smallrain.net/study_show.asp?id=710

函数的apply、call方法和length属性
JavaScript为函数对象定义了两个方法:apply和call,它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别:
Function.prototype.apply(thisArg,argArray);
Function.prototype.call(thisArg[,arg1[,arg2…]]);
从函数原型可以看到,第一个参数都被取名为thisArg,即所有函数内部的this指针都会被赋值为thisArg,这就实现了将函数作为另外一个对象的方法运行的目的。两个方法除了thisArg参数,都是为Function对象传递的参数。下面的代码说明了apply和call方法的工作方式:
//定义一个函数func1,具有属性p和方法A
function func1(){
      this.p="func1-";
      this.A=function(arg){
            alert(this.p+arg);
      }
}
//定义一个函数func2,具有属性p和方法B
function func2(){
      this.p="func2-";
      this.B=function(arg){
             alert(this.p+arg);
      }
}
var obj1=new func1();
var obj2=new func2();
obj1.A("byA");     //显示func1-byA
obj2.B("byB");     //显示func2-byB
obj1.A.apply(obj2,["byA"]); //显示func2-byA,其中[“byA”]是仅有一个元素的数组,下同
obj2.B.apply(obj1,["byB"]); //显示func1-byB
obj1.A.call(obj2,"byA");   //显示func2-byA
obj2.B.call(obj1,"byB");   //显示func1-byB
可以看出,obj1的方法A被绑定到obj2运行后,整个函数A的运行环境就转移到了obj2,即this指针指向了obj2。同样obj2的函数B也可以绑定到obj1对象去运行。代码的最后4行显示了apply和call函数参数形式的区别。
与arguments的length属性不同,函数对象还有一个属性length,它表示函数定义时所指定参数的个数,而非调用时实际传递的参数个数。例如下面的代码将显示2:
function sum(a,b){
      return a+b;
}
alert(sum.length);
分享到:
评论
3 楼 kaishiba 2009-03-23  
好 简单 继续学习~~
2 楼 liang.zeng 2008-12-29  
[b]asdfasdfaaa[/b]
1 楼 yuminglong 2007-12-21  
好,谢谢了。我有点懂了,一开始完全不懂。

相关推荐

    JavaScript函数apply()和call()用法与异同分析

    本文实例分析了JavaScript函数apply()和call()用法与异同。分享给大家供大家参考,具体如下: JavaScript的函数是对象,因此有属性和方法。每个函数都包含两个属性:length和prototype,每个函数都包含两个非继承而...

    JavaScript函数内部属性和函数方法实例详解

    函数方法(非继承)包括:apply()和call() 继承而来的函数方法:bind()、toString()、toLocaleString()、valueOf() 其他的目前不熟,后面再补充 1. 函数内部属性 在函数内部,有两个特殊的对象,arguments和this。...

    javascript语言参考+教程 CHM

    apply 方法; asin 方法; atan 方法; atan2 方法; atEnd 方法; big 方法; blink 方法; bold 方法; call 方法; ceil 方法; charAt 方法; charCodeAt 方法; compile 方法; concat 方法 (Array); concat ...

    Javascript数组操作高级心得整理

    (1) JavaScript对象也是有属性和方法的 15  对象属性的使用 15  对象方法的使用 15 (2) 对象的定义与实例化 15 (3) 对象的作用域 16  JavaScript对象只有公用作用域 16  JavaScript对象没有静态作用域 16 ...

    微软JavaScript手册

    length 属性 (Array) 返回比数组中所定义的最高元素大 1 的整数值 。 length 属性 (Function) 返回为函数所定义的参数个数。 length 属性 (String) 返回 String 对象的长度。 小于运算符 (<) 比较两个表达式,...

    javascript文档

    length 属性 (Array) 返回比数组中所定义的最高元素大 1 的整数值 。 length 属性 (Function) 返回为函数所定义的参数个数。 length 属性 (String) 返回 String 对象的长度。 小于运算符 (<) 比较两个表达式,...

    程序员面试刷题的书哪个好-js-interview-prep:JavaScript面试准备

    (和有用的方法) keys() - 返回一个数组,其中包含所有给定对象自己的可枚举属性的名称。 values() - 返回给定对象自己的可枚举值的数组。 length - 指定函数预期的参数数量。 name - 函数的名称。 apply(thisArg, ...

    我的javascript 函数链之演变

    最易读版 代码如下: function chain(obj){ function fun(){ if (arguments.length == 0){ return fun.obj; } var methodName = arguments[0], methodArgs = [].slice.call(arguments,1); fun.obj[methodName].apply...

    AJAX 源码范例

    06/6.1.6.html prototype原型对象范例 06/6.2.6.html 函数的apply、call方法和length属性范例 06/6.2.7.html 深入认识JavaScript中的this指针范例 06/6.3.2.html 使用prototype对象定义类成员...

    js设计模式源码

    // call 和 apply 方法都是用来调用“不属于自身的方法”,apply第二参数必须是数组 // 下面的代码相当于 arguments.slice,但是arguments本身没有 slice方法 // slice 方法是用来截取数组 // arguments...

    js使用小技巧

    Javascript小技巧一箩筐 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode ...

    出现问题a is defined高手帮忙

    i<DIVS_TO_CREATE.length; i++) { var id = DIVS_TO_CREATE[i]; var div = document.createElement("div"); DragZoomUtil.style([div], {position: 'absolute', display: 'none'}); zoomDiv.appendChild(div); ...

Global site tag (gtag.js) - Google Analytics