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的话,要改变上下文环境,不能在调用该参数的函数时改变,而是在该参数被使用的地方改变上下文路径。