Javascript 全局对象调用函数?

标签 javascript global-variables scope

我有一个非常奇怪的 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/

相关文章:

javascript - 从 div 中删除所有 jsPlumb 端点

javascript - HTML - 在包含 anchor 标记时使 td 可调整大小

javascript - 使用 Javascript 向表添加新行

C++ 全局和作用域整数初始值

scope - 为什么泛型生命周期不符合嵌套范围的较小生命周期?

javascript - 如何检查表格是否失焦

python - python中的多处理模块和修改共享全局变量

Javascript变量局部和全局混淆

random - 为什么这个 rand use 语句在 rust 中起作用?

python - 在类范围内动态覆盖列表的内置函数