ES6_函数方法

  1     //2017/7/15
  2         //Javascript 中的方法:在一个对象中绑定函数,称为这个对象的方法。
  3         /*1*/
  4         var boy={
  5             name:'xiaoming',
  6             birth:2007,
  7             age:function(){
  8                 var y=new Date().getFullYear();
  9                 return y-this.birth;//注意这里的this,在这个方法内部,this始终指向当前对象,也就是boy这个对象,this.birth可以取到boy对象里的birth的值。
 10             }
 11         };
 12 
 13         console.log(boy.age);//打印出整个函数
 14         console.log(boy.age());//10
 15 
 16         /*2*/
 17         function getAge(){
 18             var y=new Date().getFullYear();
 19                 return y-this.birth;
 20         }
 21 
 22         var boy={
 23             name:'xiaoming',
 24             birth:2007,
 25             age:getAge
 26         }
 27 
 28         console.log(boy.age());//10
 29         console.log(getAge());//NaN。注意:这里单独调用getAge()函数,该函数的this指向全局对象,也就是window。
 30 
 31         /*3*/
 32         var fn=boy.age;//不能先拿到boy的age函数,要保证this指向正确,必须用obj.xxx()的形式调用。
 33         console.log(fn());//NaN。
 34 
 35 
 36         /*4*/
 37         //this的指向是个大问题,ECMA决定,在strict模式下让函数的this指向undefined,因此,在strict模式下,我们会得到一个错误,这只是让错误暴露出来,并没有解决this应该指向的正确位置。
 38 
 39         "use strict";
 40         var xiaoming={
 41             name:"xiaoming",
 42             birth:2007,
 43             age:function(){
 44                 var y=new Date().getFullYear();
 45                 return y-this.birth;
 46             }
 47         };
 48 
 49         var fn=xiaoming.age;
 50         fn();//Uncaught TypeError: Cannot read property 'birth' of undefined
 51 
 52         /*5*/
 53         "use strict";
 54         var xiaoming={
 55             name:"xiaoming",
 56             birth:2007,
 57             age:function(){
 58                 function getAge(){
 59                     var y=new Date().getFullYear();
 60                     return y-this.birth;
 61                 }
 62                 return getAge();
 63             }
 64         };
 65         xiaoming.age();//es6.html:426 Uncaught TypeError: Cannot read property 'birth' of undefined
 66         console.log(xiaoming.age());//在非strict模式下:NaN
 67 
 68         //这是因为this指针只在age方法的函数内指向xiaoming,在函数内部定义的函数又指向undefined(在非strict模式下,它重新指向全局对象window!)。
 69 
 70         /*6*/
 71        //修复方法:用一个that变量首先捕获this。
 72 
 73         "use strict";
 74         var xiaoming={
 75             name:"xiaoming",
 76             birth:2007,
 77             age:function(){
 78                 var that=this;//一开始就捕获this,可以放心地在其他方法内部定义其他函数,而不是吧所有的语句都写在同一个方法中。
 79                 function getAge(){
 80                     var y=new Date().getFullYear();
 81                     return y-that.birth;
 82                 }
 83                 return getAge();
 84             }
 85         };
 86         // xiaoming.age();
 87         console.log(xiaoming.age());//10
 88 
 89         /*7*/
 90         //用apply修复getAge()调用
 91         //要指定函数的this指向哪个对象,可以用函数本身的apply方法,该方法接收两个参数,一个是要绑定的this变量,第二个参数是Array,表示函数本身的参数。
 92          // function getAge(){
 93              var y=new Date().getFullYear();
 94              return y-this.birth;
 95          }
 96 
 97          var xiaoming={
 98              name:"xiaoming",
 99              birth:2007,
100              age:getAge
101          }
102 
103          console.log(xiaoming.age());//10
104          console.log(getAge.apply(xiaoming,[]));//10
105 
106          /*8*/
107 
108          //apply()方法与call()方法
109          //apply()方法是把参数打包成Array再传入。
110          //call()方法把参数按顺序传入。
111 
112          //eg:条用Math.max(3,4,5)
113          Math.max.apply(null,[3,4,5]);//5
114          Math.max.call(null,3,4,5);//5
115          //对于普通函数调用,我们通常把this绑定为null。
116 
117          /*9*/
118 
119          //注意:利用apply(),可以动态改变函数的行为。以下函数的作用是统计parseInt函数被调用了几次。
120         var count=0;
121         var oldParseInt=parseInt;
122 
123         window.parseInt=function(){
124             count+=1;
125             return oldParseInt.apply(null,arguments)
126         };
127 
128         parseInt('10');
129         parseInt('20');
130         console.log(count);//2
原文地址:https://www.cnblogs.com/LinSL/p/7182873.html