gpt4 book ai didi

javascript - 闭包中变量引用的意外行为

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

当我希望返回对象中的成员具有父作用域中定义的变量的正确值时,我遇到了一个问题。但是,这个成员的值永远不会改变,我不得不创建一个 getter 方法来检索正确的值。对于一个简单的例子,下面是图的邻接矩阵表示的子集:

function AdjacencyMatrix() {
// Here is the set of Vertices
var V = [1, 2, 3];

// Here's some functionality that will remove a vertex at some point,
// right now we're just concerned with updating what V is equal to
function removeVertex(v) {
V.push(4);
V = [];
console.log(V);
}

// A "getter" method for the list of vertices
function getVertices() {
return V;
}

// Ran when the Adjacency Matrix is initialized
console.log(V);

return Object.freeze({
// Member that holds a reference to V
vertices: V,

// Methods that will be used later
removeVertex: removeVertex,
getVertices: getVertices
});
}

// Initially logs [1, 2, 3], which is expected
var M = AdjacencyMatrix();

// Logs [], which is expected
M.removeVertex();

// Logs [1, 2, 3, 4], which is unexpected.
// Instead, it should log []
console.log(M.vertices);

// Logs [], which is expected
console.log(M.getVertices());

返回对象中的 vertices 成员不应该始终保持对变量 V 指向的内容的引用吗?相反,在此示例中,访问 M 上的 vertices 成员维护对最初分配给变量 V 的数组的引用,并忽略任何重新分配变量 V

或者,当将 vertices 成员分配给 V 时,它是否持有对 V 值的引用,而不是变量的任何值有吗?

抱歉,如果这个问题的措辞难以理解,我已尽力陈述我的期望和结果。

最佳答案

顶点:V,表示:

引用 V 引用 vertices 属性。

就是这样 - 它不是闭包,它只是一个赋值。

因此,一旦您重新分配 V 以引用其他内容 - vertices 属性不会反射(reflect)这一点,因为它存储了原始引用。

关于javascript - 闭包中变量引用的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27627029/

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