回调函数this

function fn2(a1,fn){
    this.a1 = a1;//这个this是指向的window还是它自身?
    fn3();
}
function fn3(){
    console.log(a1);
}
fn2(123);
阅读 3.8k
7 个回答

看执行环境
在对象中的方法,this会指向该对象。

但是this的值,可以通过.call() .apply() .bind()修改。

可以参考

https://developer.mozilla.org...

this指的是,调用函数的那个对象。

你函数调用的那个对象是window,也就是window.a1 = a1,执行完函数后a1就是全局变量了

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绑定的解释之后清楚很多。题主可以参考一下看看

你函数里的this是window。我觉得有时候不要把这些想得复杂了,就看函数执行有没有人调用,没有就window。

新手上路,请多包涵

在定义的时候this指向谁是不确定的,要看在执行的时候是谁调用的你这个直接执行就是默认的 为window

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题