一,arguments he this ;
arguments 是一个类数组对象,里保存这函数实际传达的参数。但它不是Array的实例,可以通过方括号访问下标的方法来获取摸一个元素,他也有length属性。并且它的值和对呀参数的值始终保持同步,但它的元素和传递的参数的内存空间是独立的,单是他们的值会同步。
this 指的是当前函数执行的环境对象,(回调函数没有这东西)不过可以通过其他方法改变函改变 this 指向的值,在全局下,指向的是window,严格模式下全局的this 指的是undefined。
二,callee ,caller
函数 里callee 属性其实是一个指针,指向拥有这个函数的arguments对象的函数,arguments.callee 指的就是拥有该arguments 对象的函数,可以在函数内部调用该函数时使用(递归),为了防止紧耦合。
caller 属性保存着调用当前函数的函数引用。如果过在全局调用当前函数,它的值为null ; 可以通过 arguments.callee.caller 找到调用当前函数的函数;(这两属性在严格模式下会报错)如:
function outer(){ inner(); } function inner(){ arguments.callee.caller; } outer();
三,length 和 prototype。
length 实际就是定义函数参数(形参)的个数(长度),
prototype 是保存函数所有实例方法的真正所在,prototype 是不可枚举的,也就无法被for-in 访问到
四,apply(), call();
两个方法实际都是在特点的作用域调用的函数,实际就是设置函数体内,this的值,他们真正强大的地方是扩充函数的作用域
apply() 接收两个参数,一个是在其中运行函数的作用域,另一个是参数数组。其中第二个可是 Array 数组,也可以是arguments对象
call() 和 apply() 一样的,第一个参数是函数执行的环境对象,,不同的是第二个参数,call() 必须是必须逐个列举出来,也就是说不能是一个数组,这就导致call() 的参数可能会是很多个,
function a(num1,num2){ return num1+ num2; } function b(num1,num2){ return a.apply(this,arguments); //传arguments对象 } function b2(num1,num2){ return a.apply(this,[num1,num2]); // 传数组 } alert(b(10,10)) //20 alert(b2(10,10)) //20
function a(num1,num2){ return num1+num2; } function b(num1,num2){ return a.call(this,num1,num2); } alert(b(10,10)) //20
五,bind()
bind() 这个方法会创建一个函数的实例,期 this 的值会被绑定到传给bind()函数的值 如:
window.color = "red"; var o = { color : "blue"}; function sayColor(){ alert(this.color); } var obj= sayColor.bind(o); obj(); // blue