函数在同一文件中定义,但在另一个文件中未定义

时间:2018-03-07 12:25:29

标签: javascript jquery

在file_b.js中我有函数

function date_of_birth(target, selector, days) { // Do something }

在file_a.js中我尝试用date_of_birth('a', 'b', 30)调用该函数,但是我收到错误: date_of_birth未定义

所以我尝试了:

window.date_of_birth = function date_of_birth(target, selector, days) { // Do something }

当我致电window.date_of_birth('a', 'b', 30);时,我收到错误: window.date_of_birth不是函数

当我致电console.log(window.date_of_birth);时,我会未定义

在我使用的两个文件中:

$(document).ready(function() {

});

为什么我的函数没有定义?

3 个答案:

答案 0 :(得分:1)

在原始代码中,它是未定义的,因为它不是全局的。当你在另一个函数中定义一个函数时,我已经完成了,就像这样:

$(document).ready(function() {
    function date_of_birth(target, selector, days) { // Do something }
});

...该功能可在ready回调中访问,而非全局。

当您将其更改为:

$(document).ready(function() {
    window.date_of_birth = function date_of_birth(target, selector, days) { // Do something };
});

确实使它成为全局的,因此错误告诉我们ready回调另一个文件(你使用函数)在{{1}之前运行在该文件中回调(你 defininig 该函数)。

如何修复它(在2018年;在2019年答案会有所不同,因为ready变得更加可行):

  1. 为您的应用选择一个唯一标识符,例如import。 (它不必是全局唯一的,它只需要A)不是在浏览器环境中定义的东西,B)不是在将来的某个时候可能在浏览器环境中定义的东西,并且C)不是你使用的任何lib定义的东西。)例如,jQuery使用MyApp

  2. 在定义此功能的文件中,执行以下操作:

    jQuery
  3. 在您使用它的文件中,使用它:

    var MyApp = MyApp || {};
    (function() {
        MyApp.date_of_birth = function date_of_birth() { /*...*/ };
    })();
    
  4. 确保定义该函数的文件位于使用它的文件之前,将它们放在HTML的末尾(就在结束MyApp.date_of_birth(/*...*/); 标记之前),并删除{{1}回调(没有必要;如果脚本位于文档的末尾,那么事情已经足够了)。

答案 1 :(得分:0)

您需要在HTML页面中file_b.js之前指定file_a.js,如下所示:

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

因此,当您从date_of_birth('a', 'b', 30)致电file_a.js时,它已通过file_b.js呈现。

答案 2 :(得分:0)

当您声明函数function date_of_birth(target, selector, days) { // Do something }时,您不需要$(document).ready(function(){ })

date_of_birth函数之外声明$(document).ready函数,然后尝试。