簡體   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