关于闭包或者是作用域的问题
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的对象的修改
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
首先,你的function里面返回来的是一个新的object对象,然后name是直接拷贝你已经在楼上几个得知了。
接着我们看一下this的指向:
恩恩,this指向了这个return的object对象,为什么呢?因为这个object其实是引用传递给了studentA,studentA调用了这个方法,this自然就指向了studentA。
为了证明这点,我们不从studentA调用,我们直接在内部调用:
是的,独自调用setName,返回来的this就是指向window的(或者说任何没有指定作用域的函数声明都会指向window)。
所以你现在知道了,studentA调用
getName
和setName
,this都是指向这个object,那么改变这个object的name不就如楼上所说:如果能让你更加理解,你应该分解return
name是原始类型,return的那一刻把name的值拷贝了了一份返回了,以后name的任何修改都影响不到你的返回值
setName方法里写 this.name = newName。 就可以了
另外,getName 也要加上 this.name
这里面其实有两个
name
属性:student
的私有属性。student
函数返回的对象。getName
和setName
方法设置的都是student
的私有属性name
。而最后一行输出的是返回对象的
name
属性。由于
name
属性是值类型,所以不会像引用类型一样,出现一处引用改变,其他引用这个对象的变量也改变的情况。