首页 > 一个闭包匿名题目,疑问this消失了么?

一个闭包匿名题目,疑问this消失了么?

    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上么


this 指向 {

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

如果写错这样: return {

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

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

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

可见,没有 test 属性。

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


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


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

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


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

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


你这个时候的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已经跑到全局了


// 从上下文看,这里的 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));

希望有所帮助~ :)

【热门文章】
【热门文章】