js函数的四种调用方式以及对应的this指向

一、函数调用,此时this是全局的也就是window

1 var c=function(){
2    alert(this==window) 3  } 4 c()//true

二、方法调用

复制代码
var myObj={
  value:2,
  inc:function(num){
   alert(this.value+num); } } myobject.inc(1); //结果3,因为this指向myObj
复制代码

注意:内部匿名函数不属于当前对象的函数,因此this指向了全局对象window

复制代码
var myObj={
   name:'myObject', value:0, increment:function(num){ this.value += typeof(num) ==='number'? num:0; }, toString:function(){ return '[object:'+this.name+'{value:'+this.value+'}]'; }, getInfo:function(){ return (function(){ return this.toString();//内部匿名函数不属于当前对象的函数,因此this指向了全局对象window  })(); } } alert(myObj.getInfo());//[object window];
复制代码
解决方法:
复制代码
 var myObj={
  name:'myObject', value:0, increment:function(num) { this.value += typeof(num) ==='number' ? num : 0; }, toString:function() { return '[object:'+this.name+'{value:'+this.value+'}]'; }, getInfo:function(){ var This=this;//先把当前的this指向存起来 return (function(){ return This.toString(); })(); } } alert(myObj.getInfo());//[Object:myObject {value:0}]
复制代码
三、用new关键字来新建一个函数对象的调用,this指向被绑定到构造函数的实例上
复制代码
 var fn = function (status){
  this.status = status;
 }
 fn.prototype.get_status = function(){
   return this.status; } var test = new fn('my status'); alert(test.get_status);//my status,this指向test
复制代码
四、apply/call调用
复制代码
function MyObject(name){
   this.name=name ||'MyObject'; this.value=0; this.increment=function(num){ this.value += typeof(num) === 'number' ? num : 0; }; this.toString=function(){ return '[Object:'+this.name+' {value:'+this.value+'}]'; }; this.target=this; } function getInfo(){ return this.toString(); } var myObj=new MyObject(); alert(getInfo.apply(myObj));//[Object:MyObject {value:0}],this指向myObj alert(getInfo.apply(window));//[object Window],this指向window
复制代码
通过call和apply可以重新定义函数的执行环境,即this的指向,这对于一些应用当中是十分常用的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值