javascript - 如何解释下面这段js代码?
PHP中文网
PHP中文网 2017-04-11 12:32:36
[JavaScript讨论组]
var x = 1;
var kit = {
    x: 2,
    buf: {
        x: 3,
        fac: function() {
            return this.x;
        }
    }
}
var kbf = kit.buf.fac;
console.log(kbf());
console.log(kit.buf.fac());
PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
PHP中文网

这其实是函数运行时this的指向问题,第一个consolethis指向的是windowx肯定就是全局变量var x = 1,第二个console里,this指向kit这个对象里的buf对象,x的值自然就是3了。
你只需要像下面代码这样把this打印出来就看得一清二楚了:

var x = 1;
var kit = {

x: 2,
buf: {
    x: 3,
    fac: function() {
        console.log(this);
        return this.x;
    }
}
}
var kbf = kit.buf.fac;
console.log(kbf());//this打印出来是window对象
console.log(kit.buf.fac());//this打印出来是buf对象
怪我咯

this跟代码中的位置没有关系,是在执行时赋值的。也就是说this只存在于函数调用(运行)期间,在变量作用域中是不存在的。

分析this时,不能看代码位置来确定,要看怎么调用的。

this是在函数运行期赋值的,这步由JavaScript引擎来做,如果函数内的this为undefined,则使 this = window

具体为下面的情景:

  1. 普通函数调用,this为全局对象或是undefined(kbf() 显然是普通函数调用,属于这种情况)

  2. 作为对象的方法,this为那个对象(kit.buf.fac() 属于这种情况,fac中的this指向kit.buf对象)

  3. new 表达式,this为以该函数为原型的新创建的对象

  4. 使用 apply/call指定 this

  5. 用bind绑定固定的this

  6. 事件处理函数中的this是当前的触发事件的DOM元素(event.currentTarget)

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

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