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???
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
this的指向分为四种
1、作为对象的方法调用;
2、作为普通函数调用;
3、构造器调用;
4、Function.prototype.call 或 Function.prototype.apply调用
(1)作为对象的方法调用,此时this指向该对象;
(2)作为普通函数调用,此时指向全局对象window对象
(3)构造器调用
JS没有类,需要构造器来创建对象。除了宿主提供的函数,大部分JS函数都可以当做构造器使用。构造器跟普通函数一模一样,区别在于调用方式。当用new运算符调用函数时,函数会返回一个对象,通常情况下,构造器的this指向返回的这个对象。
(4) call ,apply和bind,this的指向为传入的第一个参数(自定义this指向)
任意一个非bind的函数这么直接调用this都指向window
很显然是跟作用域有关,同时你要知道window这个东东 是个全局默认的对象。你可以换个写法来理解这个log. 实际上 这个log是属于c这个对象的所有 可以这样写,
这个里面的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都是动态绑定的,因为函数只是一个可执行的代码块而已。