当以某种方式声明时,外部文件中的Javascript函数是未定义的

时间:2010-04-16 07:28:33

标签: javascript jquery

从同一个js文件中调用时,

myfunc()成功运行。但是从HTML页面调用时它是未定义的(Firebug):

JS档案:

$(function() {
    myfunc() {
        alert('inside myfunc');
    }
    alert('outside myfunc');
    myfunc(); //this successfully runs myfunc()
});

HTML:

<script>
$(function() {
    myfunc(); //this doesn't run myfunc(). It's undefined
});
</script>

但是当我将myfunc()声明更改为:

myfunc = function () { ... }

它不再是未定义的,并且成功运行。

对不起这个非常棒的问题,但刚刚发生了什么?当我改变声明函数的方式时,为什么它可以工作?

2 个答案:

答案 0 :(得分:9)

这是一个范围问题。

$(function() {
    myfunc() {
        alert('inside myfunc');
    }
    alert('outside myfunc');
    myfunc(); //this successfully runs myfunc()
});

它仅在匿名函数(function() { })中可用,因此如果您在匿名函数之外但在同一个js文件中调用它,它也将不可用。

如果您使用

声明它
myfunc = function () { ... }

myfunc是一个全局变量,该函数随处可用。

答案 1 :(得分:3)

在第一个代码段中,myfunc仅存在于您定义的匿名函数的范围中。在第二个代码段中,myfunc不在任何可见范围内。最后,在顶级定义myfunc的第三个代码段中,它在全局范围内可用,因此您的javascript的任何其他部分都可以成功调用它。

如果您发现自己仍然无法理解Javascript中的变量范围,您可能需要尝试阅读the results for "javascript scope" on Google中的一些内容以获得更全面的解释。