关于js的this指向。

var m = function() {
    a = 3;
    console.log(a, b ,this)
};

var init = function () {
    var a = 1;
    var b = 10;
    m.call(this);
}
init();

var m = function() {
    a = 3;
    console.log(a, b ,this)
}.bind(this);

var init = function () {
    var a = 1;
    var b = 10;
    m();
}

init();

会报错,b is not defined, m里的this还是指向了windows

如何通过不传参数的形式,可以访问到init中的变量b?换句话说,可以通过改变m函数调用时的this指向,访问到init中的b嘛?

阅读 4.8k
11 个回答

始终记住一句话:this永远指向最后调用他的对象

当你执行init时,是window对象在执行,最后调用了上面m方法,因为在这个方法中,变量a是没有声明的,所以提升到全局层,因此你是可以在window对象下找到变量a的。如果要达到题主所说的效果,在题主的基础上可以这样修改:

var m = function(b) {
    a = 3;
    console.log(a, b ,this)
};

var init = function () {
    var a = 1;
    var b = 10;
    m.call(this , b);
}
init();

或者说将init提升到一个对象里面去吧:

var m = function() {
    a = 3;
    console.log(this.a, this.b ,this)
};
var aa = {
    a : 1,
    b : 10,
    init : function () {
        this.a = 2;
        this.b = 20;
        m.call(this);
    }
}
aa.init();

感觉有点坑 天天都是this指向 我觉得你更应该关注this怎么用.
向这样,var一堆a 然后重新赋值 其实并没有实际意义

不管怎么改this指向,本质上都是把init中声明的变量传到m中

var m = function() {
    a = 3;
    console.log(this.a, this.b ,this)
};

var init = function () {
    var a = 1;
    var b = 10;
    m.call({
        a:a,
        b:b
    });
}
init();


var m = function() {
    a = 3;
    console.log(this.a, this.b ,this)
};

var init = function () {
    this.a = 1;
    this.b = 10;
    
    m.call(this);
}
new init();

你上面两种写法,不管是哪个this,都是指向window啊

var m = function() {
    a = 3;
    console.log(this.a, this.b,this);
};
var init = function(){
    var a = 1;
    var b = 10;
    return {
        a:a,b:b
    }
};
m.call(init());

随手写的格式不标准 将就看下

call()函数的第一个参数是执行该函数的对象,你这里一直往里面传的就是window对象。所以要么传另外的Obj进去,要么就把a,b两个参数绑在window对象上就行。

var m = function() {
    this.a = 3;
    console.log(this.a, this.b ,this)
};

var init = {};
init.a = 1;
init.b = 2;
init.x = function() {
    m.call(this);
}
init.x();

这里的this指代init这个object

如果不是给对象加事件时候写的函数,那么this表示的都是windows对象也就是你写的函数都是属于windows的对象,你可以用console.log打印出windows,然后可以找到你写的方法。b报错,是因为b是局部变量,不能在m函数中使用,你把定义b的var去掉就好了

作为普通函数调用时,this指向window

var m = function() {
    a = 3;
    console.log(init.b)
}

var init = function () {
    var a = 1;
    arguments.callee.b = 10;
    
    m();
}
init()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题