我有一个非常奇怪的 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?
如果代码确实如您所示,那行代码将不会生成函数调用。该行只是对 x
的 id
属性的赋值。通过分配给 x
的 id
属性来触发函数调用的唯一方法是,如果您使用的是支持属性访问器(getter 和 setter)的浏览器,这是极不可能的(并且您的代码中没有任何内容这样做)。
其他东西似乎在某种循环中调用 g
,因此您更改值会使下一次调用 g
看到更改。正如 Jonathon 在他对这个问题的评论中指出的那样,这可能是您使用 setTimeout
或 setInterval
或偶数处理程序(鼠标移动时,例如)等,但在引用的代码中没有任何内容。
可能偏离主题:
你一开始就有这行代码:
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/