function fn2(a1,fn){
this.a1 = a1;//这个this是指向的window还是它自身?
fn3();
}
function fn3(){
console.log(a1);
}
fn2(123);
function fn2(a1,fn){
this.a1 = a1;//这个this是指向的window还是它自身?
fn3();
}
function fn3(){
console.log(a1);
}
fn2(123);
this 是 window。因为你的 fn2 调用是普通函数调用,没有当做构造函数调用。当做构造函数调用需要用 new 关键字,代码如下:
function fn2(a1,fn){
this.a1 = a1;//这个this是指向的window还是它自身?
console.log(this);
fn3();
}
function fn3(){
console.log(a1);
}
var b = new fn2(222, fn3);
这样 this 就是 b 对象了。
如果是直接执行的话,fn2是在window环境下执行的,因此this指向的是window。
但是如果是new fn2(123)
,那么this指向的就是fn2自己,fn3执行时就会报错,提示a1没有定义
默认你的函数是在全局下声明的,则函数fn2是由window调用的,所以this绑定的是window对象,如果你在函数fn3还有this,那么调用函数fn2时,fn3中的this就指向fn2,JS中this的绑定主要看谁调用了这个函数。JS中this绑定有四种情况(默认绑定,显示绑定,隐式绑定,new绑定),我一开始也是一脸懵逼,看了《你不知道的JavaScript(上卷)》中this绑定的解释之后清楚很多。题主可以参考一下看看
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
看执行环境
在对象中的方法,this会指向该对象。
但是this的值,可以通过.call() .apply() .bind()修改。
可以参考