猿问

关于闭包或者是作用域的问题

function student () {

    var name = 'xxx';

    var getName = function () {

        return name

    }

    var setName = function (newName) {

        name = newName;

    }

    return {

        getName: getName,

        setName: setName,

        name: name

    }

}

var studentA = student();

console.log(studentA.getName())

studentA.setName("aaa");

console.log(studentA.getName())

console.log(studentA.name);

为啥输出了是

按道理不是名字已经变成aaa了吗?


更具指导是要在get和set里面都加上this.name就可以了,请问是为什么,我之前写的两个name不是同一个作用域?


我知道了,我把闭包分配的空间和return的空间混淆在一起了,所以没用this是对闭包的 空间的修改然后用this是对这个return的对象的修改


扬帆大鱼
浏览 375回答 4
4回答

撒科打诨

name是原始类型,return的那一刻把name的值拷贝了了一份返回了,以后name的任何修改都影响不到你的返回值

慕雪6442864

这里面其实有两个name属性:一个是函数student的私有属性。一个是执行student函数返回的对象。getName和setName方法设置的都是student的私有属性name。而最后一行输出的是返回对象的name属性。由于name属性是值类型,所以不会像引用类型一样,出现一处引用改变,其他引用这个对象的变量也改变的情况。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答