Javascript全局对象调用函数?

时间:2010-12-31 15:40:10

标签: 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被更改时被调用或重新运行。我根本无法理解这一点,因为它们不在同一范围内,更改变量应该在任何情况下都不会触发任何内容?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

  

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

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

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


可能偏离主题:

一开始就有这行代码:

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

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

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

关闭-主题

除了使用URI的属性(如javascript:元素上的href)之外,您不使用a伪协议。 onclick属性不接受URI,它需要JavaScript代码,因此更改:

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

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

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

obj.firstChild.onclick = o;

...甚至考虑使用addEventListener或其IE对应attachEvent代替。

答案 1 :(得分:0)

非常感谢您的回答。我现在已经弄明白了这个问题。只要单击某个tableRow对象,就会调用函数g()。这个tableRow包含obj.firstChild。因此,当我点击obj.firstChild时,o()和g()都会被执行。

现在我必须弄清楚如何在单击obj.firsChild时阻止调用g()。