功能未定义:必须在同一文件中定义javascript函数吗?

时间:2012-01-19 15:05:29

标签: javascript jquery html requirejs undefined-reference

我有一个文件notifications.js,其中包含一个绑定到元素的事件和一个函数updateNotification()。当JSON对象作为参数传递时,此函数使用jQuery更新页面上的某些元素。

问题:

我试图在页面中调用此函数(通过<script>标签),但是不是调用它,而是打破了页面。我在Chrome开发者控制台中进行了一些挖掘(不确定名称),并标记了错误:

/pleaseshare/views/install/:50 Uncaught ReferenceError:updateNotification is not defined

但是,当我在控制台中平移时,我可以清楚地看到脚本下列出的文件notifications.js,并在那里定义了该功能。如果我在当前范围内定义函数(例如调用上方的行),它可以正常工作。

我尝试了什么

该函数包含一些需要jQuery的javascript,因此我尝试使用和不使用$(document).ready( function() {});包含它,但似乎没有任何影响。

我很难过。

为了更好地衡量,这里有一个显示我的javascript和html结构的链接:http://snippi.com/s/znk6xe9

任何帮助,找出为什么会发生这种情况,或解释为什么javascript函数不能被称为跨文件(虽然我希望不是这种情况),将不胜感激;)!!

4 个答案:

答案 0 :(得分:1)

除非在尝试调用它之前在同一文件中定义或加载了一个函数,否则无法调用该函数。

除非函数与试图调用它的范围相同或更大,否则无法调用该函数。

您的代码看起来像结构应该工作,但显然是一个简化的测试用例已经减少到不会的程度。

答案 1 :(得分:1)

搞定了。问题肯定是多方面的,但我明白了。

首先使用RequireJS对updateNotification()产生了影响,因为它不能被称为跨文件,因此被认为是未定义的。我假设这是因为RequireJS如何加载文件,我稍后会查看文档(如果发现任何相关内容,则发布编辑)。

其次,当{jinc的DOM就绪加载器updateNotification()中包含$(document).ready(function(){})时,updateNotification()将被视为未定义。但是$(document).ready(function(){})包含需要jQuery的执行,所以我必须在{{1}}中包含函数的内容。

这是RequireJS / jQuery非常独特的问题,因此在大多数用例中都不会发生这种情况。

旁注:编辑标签以反映这一点。

答案 2 :(得分:0)

您需要将脚本导入页面:

<script type="text/javascript" language="javascript" src="path/to/notifications.js"></script>

这需要添加 调用<script>的{​​{1}}标记

答案 3 :(得分:0)

不需要在同一个文件中声明函数。实际上,避免将所有声明转储到全局命名空间中通常是JavaScript中的一个问题。

在您提供的链接中的示例代码中,updateNotification被声明为全局,因此不应存在范围问题。

但是,在同一示例中,您不会显示包含的notifications.js。您需要使用<script></script>元素导入它,该元素必须位于包含对updateNotification的调用的脚本元素之前。您还必须在 notifications.js之前包含jQuery ,因为它使用jQuery。所以你需要这样的东西:

<body>
    // One or two elements
    <script type="text/javascript"
            src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

    <script type="text/javascript" src="notifications.js"></script>

    <script type="text/javascript">
        $(document).ready( function() {
            var json = {status : 'ok', message: 'Hello'};
            updateNotification(json);
        });
    </script>
    // All other elements
</body>