[英]Returning the value of a key within an object, passed as an argument , what am I doing wrong?
[英]Returning passed argument as object
function Hello(name) {
function changeName(newName) {
name = newName;
}
return {
changeName: changeName,
name: name
};
}
var o=Hello("Martin");
o.name; // "Martin"
o.changeName("Marc");
o.name; // "Martin"
通過上面的代碼,很明顯changeName
不會更改name
屬性。
1.為什么?
2. changeName
實際更改了什么?
您必須使用“ this”指定要更改該對象的屬性,否則“名稱”將只是局部變量...
嘗試:
function changeName(newName) {
this.name = newName;
}
function changeName(newName) {
name = newName;
}
正在更改局部變量name
(參數),而不是返回的對象的屬性。 由於字符串是不可變的,因此在執行以下操作時:
var str = "str";
var str2 = str;
str和str2是不同的對象。 如果修改str
,則str2
不會受到影響。
您可以執行以下操作:
function Hello(name) {
function changeName(newName) {
obj.name = newName;
}
var obj = {
changeName: changeName,
name: name
};
return obj;
}
當使用"Martin"
調用函數Hello
時,將聲明為函數Hello
的參數的變量name
的值分配為"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
,這意味着只要在其他地方使用此name
(在其他閉包中就是一個例子),對變量name
任何更改都將反映出來。 這很難在代碼中看到,因為Hello
運行后唯一使用該name
地方是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()
方法返回名稱時,請changeName()
this
關鍵字。
function Hello(name) {
function changeName(newName) {
this.name = newName;
}
return {
changeName: changeName,
name: name
};
}
var o=Hello("Martin");
console.log(o.name); // "Martin"
o.changeName("Marc");
console.log(o.name);
您正在嘗試使按值或按引用進行的傳遞神秘化:
當傳入基本類型變量(例如字符串或數字)時,該值將按值傳入。 這意味着在函數中對該變量所做的任何更改都與在函數外部發生的一切完全分開。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.