javascript - 关于this指向
黄舟
黄舟 2017-04-11 12:43:26
[JavaScript讨论组]
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???

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(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指向)

PHP中文网

任意一个非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都是动态绑定的,因为函数只是一个可执行的代码块而已。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号