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的对象的修改
首先,你的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