为什么当我触发一个函数时会抛出一个未定义的错误?我有一个带有我所有脚本的外部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();>
答案 0 :(得分: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"
});
这些问题源于糟糕的范围,将事物置于全球范围内,不应该是全球性的,反之亦然。找出你想要代码的位置。
答案 1 :(得分:0)
在另一个函数中定义的函数是包含函数的函数的局部函数,并且不存在于函数外部。
无论如何,您都不需要$(document).ready(function() {...}
来定义函数,因为它们只是通过定义而不对DOM做任何事情。
答案 2 :(得分:0)
Javascript不是预编译的,它被认为是JIT(只是及时编译)。
您的javascript函数可能包含语义错误,无法编译,因此无法引用。
此外,您的功能可能超出了范围,正如其他答案所描述的那样。
答案 3 :(得分:0)
尝试使用$("#someId").bind('change', function() { //handler...
另外,将html属性包装在引号中。
答案 4 :(得分:0)
我在另一个StackOverflow线程中遇到过这个问题:
使用window属性将变量设置为全局命名空间会产生奇迹。
window.getAlert = getAlert;
然后我能够在我的代码中的任何位置访问该变量。我仍然不完全理解为什么,但它现在有效。
我感谢所有有用的回复,这些回应引导我做出最终答案。我仍然试图从头开始编写javascript。我可以操纵它并阅读它,但是从头开始编写通常会因为差的范围等而导致错误。再次感谢