函数内部的属性: arguments 和this是函数内部的两个特殊对象 arguments: function recursion(num){ if(num<=1){ return 1; }else{ return num*recursion(num-1); } } 另一种写法: function recursion(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } } arguments:表示当前参数的数组 arguments.callee 表示引用当前正在正在执行的函数,或者说是调用arguments.callee的函数 的引用,arguments.callee给匿名函数提供了一种自我引用的方式 var func=function(){ alert(func===arguments.callee); } func();//调用该函数,我们得出的结果是true 从该例子我们可以看出func和arguments.callee对象的类型和值都相等。 callee属性的初始值就是正在执行的Function对象 caller: 返回一个对函数的引用,该函数调用了当前函数 this 对象: this对象引用的是window(windwo是一个对象,而且是js当中最大的一个对象 ,并且它是最外围的对象) alert(window);//[object window] alert(typeof window);//object window 是对象 类型是对象 表示全局 alert(this); // [object Window] this 目前表示的是window,因为在window的范围下 alert(typeof this);//object alert(this===window);//返回值为 true 在“全局”变量下的this 就是window window.color=‘红色的‘; function sayColor(){ //alert(this);// [object window] alert(this.color);//因为该函数 sayColor() 未赋值给一个对象 所以此处的this依然代表着window对象 } sayColor();// 调用的是window下的color var box={ color:‘蓝色的‘ }; box.sayColor=sayColor;将sayColor函数赋值给了 box对象的sayColor属性 /* 上边的代码其实就相当于 var box={ color:‘蓝色的‘, sayColor:function(){ //alert(this);// [object Object] alert(this.color); } }; */ box.sayColor();//此处执行的是box里边的this.color //结果是 蓝色的 -------------------------------------------- <script type="text/javascript"> function box(num1,num2){ return num1+num2; } //可以使用这种方式将sum函数转换成 box方法 function sum(num1,num2){ return box.apply(this,[num1,num2]);//此处的this指的是window对象(将this换成window也是一样的),数组表示的是传递的参数 } alert(sum(19,21));//返回的结果是40 ->函数apply: 语法:apply[[thisObj],[argArray]] 定义:应用某一个对象的一个方法,用一个对象替换当前对象 thisObj代表某一个对象 上述例子中这个对象是当前对象 this argArray表示用来替换当前对象的的对象的参数 数组 上述例子的另一个中写法 function sum2(num1,num2){ return box.apply(this,arguments);//arguments代表的是box函数中参数的数组 } alert(sum2(10,10)); ->使用apply和call可以冒充另一个方法 apply与call实现的效果是一样的 call和apply不同的是 call中的参数是一个一个的,而apply则必须以数组的形式传递 function sum(num1,num2){ return box.call(this,num1,num2);//注意参数的传递方式和apply的不同之处 } alert(sum(10,10)); 冒充的作用:主要用于扩展函数赖以运行的作用域 /* var color=‘红色‘; var box={ color:‘蓝色‘ }; function sayColor(){ alert(this.color); } //使用call 冒充 window对象 sayColor.call(window);//红色 弹出的是window对象的 color sayColor.call(this);// 红色 弹出的样式window对象的color //使用call 冒充 box对象 sayColor.call(box);//蓝色 弹出的是 box对象下的color属性 */ 此时 可以看出 并没有给box对象添加 sayColor属性对象却可以执行出 sayColor的效果
原文:http://www.cnblogs.com/Shang0109/p/3857523.html