javascript - 一个闭包匿名题目,疑问this消失了么?
大家讲道理
大家讲道理 2017-04-10 18:10:03
[JavaScript讨论组]
    var test='global';

    var c=function(){
        var test='test';
        return {
            pre:function(){
                console.log(this.test);
                return 'ste';
            }
        }
    }();

    console.log(c.pre());

这个结果为何是

  1. undefined

  2. ste
    这个undefined 是如何出现的,我的理解

题目中c.pre(),不应该是作为属性调用,将pre的作用域挂钩到c的objec上么

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(7)
黄舟

this 指向 {

        pre:function(){
            console.log(this.test);
            return 'ste';
        }    这个对象,这里面的 test=undefined;

如果写错这样: return {

        test:2,
        pre:function(){
            console.log(this.test);
            return 'ste';
        }
    }
你再看哈效果
怪我咯

undefined来自 console.log(this.test);

这里的this是包含了pre方法的那个匿名对象。

ringa_lee
{
    pre:function(){
    console.log(this.test);
    return 'ste';
}

上面的json字面量里并没有test这个属性,所以结果为undefined

高洛峰

这个才是 c,pre() 中的 this 指向的是 c,不是 global

{
    pre:function(){
        console.log(this.test);
        return 'ste';
    }
}

可见,没有 test 属性。

匿名函数中的 var test='test' 只是申明了一个局部变量,不是任何对象的属性。

巴扎黑
// 从上下文看,这里的 this 是 c,但 c 没有 test 属性,所以 c.test 就是 undefined
console.log(this.test);

如果你需要 c.test 输出 test 值,就需要在 return 增加公开访问的属性。

return {
    test: test,
    pre:function(){
        console.log(this.test);
        return 'ste';
    }
}

如果你需要 c.test 输出 global 值,就要替换函数的接收者

console.log(c.pre.call(this));

希望有所帮助~ :)

迷茫

你这个时候的this 已经是指向全局了

这个地方我说错了,

var test='global';

var c=function(){
    var test='test';
    // 你这个时候,返回的是一个对象
    return {
        pre:function(){
            console.log(this.test);
            return 'ste';
        }
    }
}();

c的方法,相当于

var c = {
    pre: function() {
        console.log(this.test);
        return 'ste';
    }
};

此时你调用c.pre(),this指向的就是当前对象

还有一种情况,如果你不是直接招行c.pre,而是将它作为参数的话,this就不是指向c对象了

function exec(func) {
    func();
}

这个时候打印的this.test就是undefined,此时this已经跑到全局了

PHP中文网

对于this指针可以这么理解,方法属于那个对象,方法中的this指针就指向哪个对象

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

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