gpt4 book ai didi

Javascript 全局对象调用函数?

转载 作者:行者123 更新时间:2023-11-30 13:36:37 24 4
gpt4 key购买 nike

我有一个非常奇怪的 javascript 问题。我的代码相当长,所以这里是结构和问题的示例:

var x = new function f() {
this.id = "";
}

function g(obj) {
if (x.id == "") {
...
obj.firstChild.setAttribute("onclick", "javascript:o();");
...
x.id = obj.id;
} else if (x.id != obj.id) {
...
x.id = "";
g(obj);
}
}

function o() {...
if (something == something) {
...
} else {
...
x.id = ""; // if-statement of the g() function is called here?
}
}

如您所见,g() 函数的 if 语句出于某种原因在 x.id 更改时被调用或重新运行。我根本无法理解这一点,因为它们不在同一范围内,并且更改变量在任何情况下都不会触发任何事情?

如有任何帮助,我们将不胜感激。

最佳答案

x.id = ""; // if-statement of the g() function is called here?

如果代码确实如您所示,那行代码将不会生成函数调用。该行只是对 xid 属性的赋值。通过分配给 xid 属性来触发函数调用的唯一方法是,如果您使用的是支持属性访问器(getter 和 setter)的浏览器,这是极不可能的(并且您的代码中没有任何内容这样做)。

其他东西似乎在某种循环中调用 g,因此您更改值会使下一次调用 g 看到更改。正如 Jonathon 在他对这个问题的评论中指出的那样,这可能是您使用 setTimeoutsetInterval 或偶数处理程序(鼠标移动时,例如)等,但在引用的代码中没有任何内容。


可能偏离主题:

你一开始就有这行代码:

var x = new function f() {
this.id = "";
}

该代码使用“命名函数表达式”,应该有效,但在某些实现(例如 IE)中会导致问题。拆分它以获得可靠的跨浏览器所需结果:

var x = new f();
function f() {
this.id = "";
}

题外话:

您不使用 javascript: 伪协议(protocol),除非在采用 URI 的属性上(例如 a 元素上的 href)。 onclick 属性不带 URI,它带 JavaScript 代码,所以更改:

obj.firstChild.setAttribute("onclick", "javascript:o();");

obj.firstChild.setAttribute("onclick", "o();");

但是,更好的是,直接分配处理程序:

obj.firstChild.onclick = o;

...甚至考虑使用 addEventListener 或其 IE 对应部分 attachEvent

关于Javascript 全局对象调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4570931/

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