javascript - 将传递的参数作为对象返回

标签 javascript

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 实际发生了什么变化?

最佳答案

当您使用 "Martin" 调用函数 Hello 时,变量 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 时,它会创建一个 closure它继承了变量 name,这意味着只要 name 在别处使用(一个例子是在其他闭包中),对变量 name 的任何更改都会反射(reflect)出来).这很难在您的代码中看到,因为在 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 方法没有您想要的效果。

关于javascript - 将传递的参数作为对象返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32250392/

相关文章:

javascript - 同步相互依赖的 Dojo 小部件/值

javascript - 工厂函数 vs Object.create - JavaScript - 何时使用哪个

javascript - 强制 “landscape” 方向模式

javascript - GM_xmlhttpRequest 在 Chrome 中 onbeforeunload 期间不起作用

javascript - jQuery 鼠标进入/离开未正确检测悬停区域

javascript - 这是 Xpath 评估中的 Chrome 错误吗

javascript - 自定义按钮 JavaScript 无法识别 CRM 2013 字段更改

javascript - 将 getChildContext() 传递给 ReactJS 高阶组件会在 Webpack 中引发意外的 token 错误

javascript - 元素 slider 不工作

javascript - 具有 jQuery 函数范围问题的 Angular 2