其实js中function自身的属性和方法还是比较多的,比如打开console它会给你一大堆的提示



         

javascript lengthb 中文字节长度 js中length方法_javascript


    


这里重点只说说length属性和call和apply (important),举个例子先:


function fn1(){
  
       console.log('fn1');
  
    }
  
   
  
    function fn2(a,b){
  
      console.log(a+b);
  
    }
  
   
  
    function fn3(a,b,c,d){
  
     fn2.call(this,a,b)+fn2.call(this,c,d);
  
    }


length属性的作用:显示方法参数的期望参数个数


javascript lengthb 中文字节长度 js中length方法_javascript_02


 

call和apply在参考手册中是这样说的


call 方法
调用一个对象的一个方法,以另一个对象替换当前对象。

call([thisObj[,arg1[, arg2[,   [,.argN]]]]])

参数
thisObj
可选项。将被用作当前对象的对象。

arg1, arg2,  , argN
可选项。将被传递方法参数序列。

说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。


 


1.apply方法作用跟call相同只是call方法第二个参数传进来的是参数序列,而apply传进来的是一个参数数组


 


引用别人的一段代码:


<input type="text" id="myText" value="input text"><script> function Obj(){this.value="对象!";} var value="global 变量"; function Fun1(){alert(this.value);} window.Fun1(); //global 变量 Fun1.call(window); //global 变量 Fun1.call(document.getElementById('myText')); //input text Fun1.call(new Obj()); //对象! </script>

 


我们发现apply()和call()的真正用武之地是能够扩充函数赖以运行的作用域,这是它的第一个用途,改变this的指向。


2.大部分浏览器都内置了Function.prototype.bind,用来指定函数内部的this指向,即使没有原生的Function.prototype.bind实现,我们来模拟一个,


Function.prototype.bind = function(context){ var self = this; return function(){ return self.apply(context,arguments); } };

 例子:

 

var obj = { name:'objName'}; var func = function(){ console.log(this.name); //输出objName }.bind(obj);

 3.借用其他对象方法

  借用方法的第一种场景是"借用构造函数",通过这种技术,可以实现一些类似继承的效果:


var sup = function(name){ this.name = name;}; var sub = function(){ sup.apply(this,arguments[0]); }; sub.prototype.getName = function(){ return this.name; }; var s = new sub('Dave'); console.log(s.getName()); //输出Dave

 

总结:


1、每个函数都包含两个非继承而来的方法:apply()和call()。 
2、他们的用途相同,都是在特定的作用域中调用函数,主要3种用途。 
3、接收参数方面不同,apply()接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。