簡體   English   中英

返回傳遞的參數作為對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM