0

为什么当我触发一个函数时,它会抛出一个未定义的错误?我有一个包含所有脚本的外部 js 文件,以及一个触发 onchange 函数的 html div。

我已经在页面顶部包含了 JS 文件,我调用的函数是 JS 文件中的第一个函数。为什么它会返回未定义?我的其他功能似乎工作正常。

我的所有函数都在一个外部 JS 文件中

$(document).ready(function(){ 

});

我认为 JS 是预编译的,声明函数等的顺序无关紧要。

示例:JS:

function makeIcon3D() {
   var icon3DStroke1 = getStrokefor3DIcon1();

       function getAlert() {
         alert('hi');
      }

 });

HTML:

<input type=text onchange=makeIcon3D();>
4

5 回答 5

2

您的代码是否如下所示:

$(document).ready(function(){ 
    function foo() {
        alert("bar");
    }
});
foo(); // <-- foo is not defined here

由于在第一个初始事件循环事件之后ready触发,这将不起作用:

var foo;
$(document).ready(function(){ 
    foo = function() {
        alert("bar");
    }
});
foo(); // <-- foo is still undefined here

您将需要执行以下操作:

var foo;
$(document).ready(function(){ 
    foo = function() {
        alert("bar");
    }
});
$(document).ready(function(){ 
    foo(); // "bar"
});

这些问题源于糟糕的范围界定,将不应该在全球范围内的事物置于全球范围内,反之亦然。弄清楚你希望你的代码在哪里。

于 2013-07-30T15:35:08.817 回答
0

Javascript 没有预编译,它被认为是 JIT(即时编译)。

您的 javascript 函数可能包含语义错误并且无法编译,因此无法被引用。

此外,正如其他答案所述,您的功能可能超出范围。

于 2013-07-30T15:37:01.327 回答
0

在另一个函数内部定义的函数是包含函数的本地函数,并且不存在于它之外。

无论如何,您都不需要$(document).ready(function() {...}定义函数,因为它们仅通过定义就不会对 DOM 做任何事情。

于 2013-07-30T15:35:16.393 回答
0

尝试绑定你的事件处理程序$("#someId").bind('change', function() { //handler...

此外,将您的 html 属性用引号括起来。

于 2013-07-30T15:39:57.720 回答
0

我在另一个 StackOverflow 线程中遇到了这个问题:

使用 window 属性将变量设置为全局命名空间会产生奇迹。

window.getAlert = getAlert;

然后我就可以在我的代码中的任何位置访问该变量。我仍然不完全明白为什么,但它现在有效。

我感谢所有使我得到最终答案的有用回复。我仍在尝试从头开始编写 javascript。我可以操纵它并阅读它,但是由于范围界定不佳等原因,从头开始编写通常会以错误告终。再次感谢

于 2013-07-30T15:54:37.997 回答