當你調用該函數Hello
與"Martin"
,變量name
的聲明爲功能Hello
參數值分配的"Martin"
值。
當您將屬性name
設置爲值name
傳遞給該函數的對象返回時,該字符串將被複制。現在o.name
有其自己的字符串,它與Hello
函數中的變量name
的值分開。對name
的任何更改都不會影響現在在對象屬性上設置的值。這可以演示如下:
var name = "Martin";
var o = {
name: name
};
name = "Marc";
console.log(o.name); // Martin
console.log(name); // Marc
這幾乎解決了您的第一個問題,但第一個問題的完整答案需要您的第二個問題的答案。當您在Hello
函數中聲明changeName
時,它會創建一個繼承變量name
的closure,這意味着只要在其他地方使用name
(其中一個示例在其他閉包中),就會反映變量name
的任何更改。這是很難在你的代碼,看看自從name
使用後Hello
運行在changeName
唯一的地方,但你可以在下面的例子看到我的意思:
function Hello(name) {
function changeName(newName) {
name = newName;
}
function seeName() {
return name;
}
return {
changeName: changeName,
seeName: seeName,
name: name
};
}
var o = Hello("Martin");
console.log(o.name); // "Martin"
o.changeName("Marc");
console.log(o.name); // "Martin"
console.log(o.seeName()); // "Marc"
這兩個因素讓這個你changeName
方法沒有你要找的效果。
你能正確調用'changeName'嗎? – Mritunjay
請參閱編輯請 – dylan1994