关于this指向

var c = {
    name: 'The c object',
    log: function() {

        this.name = 'Updated c object';
        console.log(this);

        var setname = function(newname) {
            this.name = newname;
            console.log(this);
        }
        setname('Updated again! The c object');
        console.log(this);
    }
}

c.log();

第二个console.log为什么是指向window???

阅读 2.5k
4 个回答

this的指向分为四种

1、作为对象的方法调用;
2、作为普通函数调用;
3、构造器调用;
4、Function.prototype.call 或 Function.prototype.apply调用

(1)作为对象的方法调用,此时this指向该对象;

(2)作为普通函数调用,此时指向全局对象window对象

(3)构造器调用
JS没有类,需要构造器来创建对象。除了宿主提供的函数,大部分JS函数都可以当做构造器使用。构造器跟普通函数一模一样,区别在于调用方式。当用new运算符调用函数时,函数会返回一个对象,通常情况下,构造器的this指向返回的这个对象。

 var MyClass = function(){
       this.name = ‘seven’;
 }
 var obj = new MyClass();
 alert( obj.name );

(4) call ,apply和bind,this的指向为传入的第一个参数(自定义this指向)

任意一个非bind的函数这么直接调用this都指向window

很显然是跟作用域有关,同时你要知道window这个东东 是个全局默认的对象。你可以换个写法来理解这个log. 实际上 这个log是属于c这个对象的所有 可以这样写,

c.log=function(){
    console.log(this);
}

这个里面的this当然是指 c 这个对象。
而后面 this 是写在 你新定义的函数里面,相当于新开辟了一块内存空间,而且你并没有将这个函数特别作为某个特定对象的方法,所以他不指向某个特定的对象,而是指向默认的window对象想,相当于 window.setname = function(){}。在js里面几乎所有的东东都是定义在window这个对象下面的。

各位的讲解都非常好,我就只说一些个人理解,首先,所有的函数,都是window对象的属性(此处忽略特殊情况,比如调用了bind返回的函数等),那么,这就行了,你只是把匿名函数给了log而已,你调用的时候也是用c.log在调用对吧,c.log就已经把this指向了c的作用域,如果你在外面写个var f=c.log;f();,那么3次都是window,this都是动态绑定的,因为函数只是一个可执行的代码块而已。

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