让人崩溃的几个小例子

var aa = function(){
   this.b=1;
   this.c = function(){
       alert(this.b);
   };
};
var a = new aa();
function abc(func){
    func();
}
abc(a.c);

这里很明显是undefined,这里的this指向的是window.

var aa = function(){
   this.b=1;
   this.c = function(){
       alert(this.b);
   };
};
var a = new aa();
function abc(func){
    func();
}
abc(function(){a.c();});

这里是1,应该是匿名函数块保存了上下文运行环境。

var aa = function(){
   this.b=1;
   this.c = function(){
       alert(this.b);
   };
};
var a = new aa();
function abc(func){
    alert(this.b);
    func();
}
abc.call(a,a.c);

我最开始愚蠢的写法,认为能改变this,这里只能改变abc函数的运行上下文环境为a,但是到func()时,还是会变为window,这里就相当于var func = a.c;func的定义环境在window,所以会指向window。

例如:

var aa = function(){
   this.b=1;
   this.c = function(){
       alert(this.b);
   };
};
var a = new aa();
var bb = {
  b:2,
  c:function(){
  alert(this.b);
     func();
  }
}
var func = a.c;
bb.c();

这里赋值的时候,就把运行上下文带到了window

var aa = function(){
   this.b=1;
   this.c = function(){
       alert(this.b);
   };
};
var a = new aa();
function abc(func){
    func.call(a);
}
abc(a.c);

改变运行上下文的正确写法。


还是总结下:传参传函数时能通过function(){func()}能保存到上下文不改变,如果传参传成func的话,要改变上下文环境,不能在调用该参数的函数时改变,而是在该参数被使用的地方改变上下文路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值