繁体   English   中英

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

[英]Why I can't access a JavaScript function defined in a .js file from another .js file?

我是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文件中设置字符串'Tony'作为person变量的值,调用logPerson()函数声明到utility.js文件中,然后在控制台中打印'Tony'。

问题是,当我尝试将index.htm文件打开到FireFox时,我进入FireBug控制台,而不是'Tony'值,我得到了这个错误信息:

ReferenceError: logPerson is not defined

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

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

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

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

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

</body>
</html>

更改

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

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

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

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

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

  1. app.js
  2. utility.js

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

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

作为JavaScript代码在运行中解释的解释很简单:作为一个脚本被加载,会立即执行。

所以,你只需要以正确的依赖顺序声明脚本。

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

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

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

就我而言,不是<script>排序是问题(最初的想法),而是定义函数的范围。 为了能够在其他JS文件功能的访问,我把它就是在这些文件的范围对象的属性。 现在,它可以作为MyObject.myFunctionMyObject实例化的任何地方访问。

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

        $.extend(this, {

              // methods
              "myFunction": myFunction,

        });
    }
}(jQuery));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM