gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:16:44 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com