为什么我无法从另一个.js文件访问.js文件中定义的JavaScript函数?

时间:2015-10-29 15:07:25

标签: javascript html

我是JavaScript新手,我正在按照教程试验全局范围。

在本教程中,我有3个文件:

1) index.htm

<html>
    <head></head>

    <body>
        <h1>HELLO WORLD !!!</h1>

        <script src="app.js"></script>
        <script src="utility.js"></script>

    </body>
</html>

如您所见,我包含2个JavaScript文件。

2) app.js

var person = 'Torny';   // When I call the logPerson() function this line override the person variable value into the global stack

//console.log(person);

logPerson();

3) utility.js ,其中定义了 app.js 文件中定义的 logPerson()函数:

var person = 'Steve';

function logPerson() {
    console.log(person);
}

好的,所以我期待以下行为:

app.js 文件中设置字符串&#39; Tony&#39;作为 person 变量的值,将 logPerson()函数调用到 utility.js 文件中,因此打印&#39; Tony& #39;在控制台中。

问题在于,当我尝试将 index.htm 文件打开到FireFox中时,我会进入FireBug控制台,而不是“Tony&#39;值我收到此错误消息:

ReferenceError: logPerson is not defined

因此,似乎从 app.js 文件中,它无法看到 utility.js中定义的 logPerson()函数文件并导入。

为什么呢?我错过了什么?怎么了?

6 个答案:

答案 0 :(得分:9)

在javascript中,文件的顺序很重要。您需要先加载定义函数的脚本,然后才能使用它。切换2 <script>代码

    

<body>
    <h1>HELLO WORLD !!!</h1>

    <script src="utility.js"></script>
    <script src="app.js"></script>

</body>
</html>

答案 1 :(得分:3)

变化

<script src="app.js"></script>
<script src="utility.js"></script>

<script src="utility.js"></script>
<script src="app.js"></script>

;)您尝试从稍后加载的脚本中获取定义 问候

答案 2 :(得分:3)

第一个浏览器将解析JS文件。

如果您看到包含脚本的顺序

  1. app.js
  2. utility.js
  3. 所以当它解析app.js.它看到logPerson()这是函数调用而不是函数定义。此时,文件utility.js未被解析,浏览器也不知道该函数。 (意思是直到它读取utility.js)。

    所以要解决这个问题,请在dom-loaded,usiing body onload函数之后调用logPerson api。

答案 3 :(得分:2)

解释就像Javascript代码在运行中解释一样简单:当一个脚本被加载时,它会立即执行。

因此,您只需按正确的依赖顺序声明脚本。

答案 4 :(得分:2)

在运行定义logPerson的脚本之前,您运行尝试使用logPerson的脚本。

如果您颠倒脚本的顺序,它将起作用。

函数声明提升仅适用于给定的脚本。

答案 5 :(得分:0)

就我而言,<script>排序不是问题(最初的想法),而是定义函数的范围。为了能够在其他JS文件中访问该函数,我将其作为 的对象的属性在这些文件的范围内。现在,只要MyObject.myFunction被实例化,就可以MyObject访问它。

(function ($) {
    function MyObject(data) {
        var myFunction = function(){
            console.log('');
        }

        $.extend(this, {

              // methods
              "myFunction": myFunction,

        });
    }
}(jQuery));