函数的属性和方法

时间:2021-05-17 19:11:58

一,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