在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  C++  網(wǎng)絡安全  HTML/ 關于閉包或者是作用域的問題

關于閉包或者是作用域的問題

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);

為啥輸出了是

clipboard.png

按道理不是名字已經(jīng)變成aaa了嗎?


更具指導是要在get和set里面都加上this.name就可以了,請問是為什么,我之前寫的兩個name不是同一個作用域?


我知道了,我把閉包分配的空間和return的空間混淆在一起了,所以沒用this是對閉包的 空間的修改然后用this是對這個return的對象的修改

回答
編輯回答
傲寒

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

2018年9月9日 09:23
編輯回答
野橘

setName方法里寫 this.name = newName。 就可以了
另外,getName 也要加上 this.name

2017年4月26日 00:21
編輯回答
任她鬧

這里面其實有兩個name屬性:

  1. 一個是函數(shù)student的私有屬性。
  2. 一個是執(zhí)行student函數(shù)返回的對象。

getNamesetName方法設置的都是student的私有屬性name。
而最后一行輸出的是返回對象的name屬性。
由于name屬性是值類型,所以不會像引用類型一樣,出現(xiàn)一處引用改變,其他引用這個對象的變量也改變的情況。

2017年4月28日 07:19
編輯回答
怪痞

首先,你的function里面返回來的是一個新的object對象,然后name是直接拷貝你已經(jīng)在樓上幾個得知了。
接著我們看一下this的指向:

function student () {
  var name = 'xxx';
  var getName = function () {
    return name
  };

  var setName = function (newName) {
    name = newName;
    
    return this;
  };

  return {
    getName: getName,
    setName: setName,
    name: name,
  };
}
var studentA = student();
var whoAmI = studentA.setName("aaa");

console.log(whoAmI); // {getName: ?, setName: ?, name: "xxx"}

恩恩,this指向了這個return的object對象,為什么呢?因為這個object其實是引用傳遞給了studentA,studentA調(diào)用了這個方法,this自然就指向了studentA。

為了證明這點,我們不從studentA調(diào)用,我們直接在內(nèi)部調(diào)用:

function student () {
  var name = 'xxx';
  var getName = function () {
    return name
  };

  var setName = function (newName) {
    name = newName;
    
    return this;
  };

  const whoAmI = setName("aaa");
  console.log(whoAmI); // Window?{postMessage: ?, blur: ?, focus: ?, close: ?, frames: Window,?…}

  return {
    getName: getName,
    setName: setName,
    name: name,
  };
}
var studentA = student();

是的,獨自調(diào)用setName,返回來的this就是指向window的(或者說任何沒有指定作用域的函數(shù)聲明都會指向window)。

所以你現(xiàn)在知道了,studentA調(diào)用getNamesetName,this都是指向這個object,那么改變這個object的name不就如樓上所說:

setName方法里寫 this.name = newName。 就可以了。另外,getName 也要加上 this.name

如果能讓你更加理解,你應該分解return

// 操作studentA就是在操作這個result
const result = {
    getName: getName,
    setName: setName,
    name: name,
};

return result;
2018年6月6日 11:09