javascript - 为什么这里的this是指向windows
高洛峰
高洛峰 2017-04-11 12:46:19
[JavaScript讨论组]
co(function *() {
            var now = Date.now();
            yield sleep200;
            console.log(Date.now() - now);
        });

        function co(fn){
            var gen = fn();
            next();
            function next(res){
                var ret;
                ret = gen.next(res);
                // 全部结束
                if(ret.done){
                    return;
                }
                // 执行回调
                if (typeof ret.value == 'function') {
                    ret.value(function(){
                        next.apply(this, arguments);
                    });
                    return;
                }
                throw 'yield target no supported!';
            }
        }

        function sleep200(cb){
            setTimeout(cb, 200)
        }

在next.apply()那一行。
我这里有点糊涂了,像这种点调用的话,this不应该指向调用者吗?也就是next对象,可这里next是个函数。可为什么是window对象呢

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(5)
PHP中文网
ret.value(function(){
    next.apply(this, arguments);
});
这里ret.value的参数是一个匿名函数,你见过匿名函数中的this不是window的情况吗?
巴扎黑

这个 this 是在 next 函数中,而不是在 next.apply 的apply 中。
next 函数的调用是 next() 所以其中的 this 是 window。
http://zonxin.github.io/post/...

ringa_lee

你在哪里打印的this?
如果co这个函数,直接执行,相当于window.co();this当然是window

大家讲道理

这段代码好绕,脑壳都被绕晕了

关键在这里

function() {
    next.apply(this, arguments);
});

这个函数是作为参数被传入 sleep200(cb) 的,也就是 setTimeout(cb, 200) 这句话里的 cb 这个参数。

很明显,在 setTimeout 到时间之后执行 cb() 绝不是 xxxx.cb() 这种方式执行,而是 cb() 这样执行,所以,cb() 里面的 this 指向全局对象,也就是 window

怪我咯

方法调用和函数调用

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

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