【问题标题】:Function is defined in the same file but undefined in another file [duplicate]函数在同一个文件中定义但在另一个文件中未定义[重复]
【发布时间】:2018-03-07 12:25:29
【问题描述】:

在 file_b.js 我有函数

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

在 file_a.js 中,我尝试使用 date_of_birth('a', 'b', 30) 调用该函数,但出现错误:date_of_birth is not defined

所以我试了一下:

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); 时,我得到undefined

在我使用的两个文件中:

$(document).ready(function() {

});

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

【问题讨论】:

  • 如何包含这些文件?
  • 简单的解决方案,在b文件的全局范围内定义函数,并在a文件中调用$(document).ready内部的函数
  • use: window.onload = function(){ // 在这里定义你的函数 }

标签: javascript jquery


【解决方案1】:

在 2020 年末,您将使用模块来执行此操作,或者依赖于所有现代主流浏览器中存在的本机支持,或者依赖于 Webpack 或 Rollup.js 等使用模块语法获取代码并将其捆绑到旧版本的捆绑器浏览器。

使用模块语法,在简单的情况下,您可以导出您想要提供的功能:

export function date_of_birth(/*...*/) {
    // ...
}

这是一个导出函数声明,它创建了一个命名导出。另一个模块中想要使用该函数的代码将 import 该函数:

import { date_of_birth } from "./module-name.js";

这个话题还有很多,更多 on MDN 或我的书 JavaScript: The New Toys 的第 13 章(如果感兴趣,可以在我的个人资料中链接)。


旧答案:

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

$(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 回调(您正在使用该函数)在 ready 回调之前运行该文件(您在其中定义函数)。

如何解决:

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

  2. 在您定义此函数的文件中,执行以下操作:

     var MyApp = MyApp || {};
     MyApp.date_of_birth = function date_of_birth() { /*...*/ };
    

    或者,如果您有用于类范围数据的共享函数或您想保持私有的东西,您可以使用包装函数:

     var MyApp = MyApp || {};
     (function() {
         function privateWorkerFunction() {
         }
         MyApp.date_of_birth = function date_of_birth() { /*...*/ };
         // ...
     })();
    
  3. 在你使用它的文件中,像这样使用它:

     MyApp.date_of_birth(/*...*/);
    
  4. 确保定义函数的文件在使用它的文件之前,将两者都放在 HTML 的末尾(就在结束 </body> 标记之前),并去掉 ready 回调(没有必要;如果脚本位于文档的末尾,则一切就绪)。

【讨论】:

  • 谢谢,这对我帮助很大。从ready() 中删除该函数就足够了,它也可以在没有唯一标识符的情况下工作。
  • @RezaSaadati:是的,但是如果你这样做,你会为每个函数创建一个全局,并且全局命名空间真的很拥挤。使用单个标识符(示例中为MyApp)有助于避免冲突。
  • 很高兴知道。谢谢,我会用你的代码。你能告诉我MyApp || {}; 代表什么吗?
  • @RezaSaadati:我真的应该解释一下。 :-) var MyApp 将声明尚未声明的变量,并为其赋予初始值 undefined。如果它已经被声明了(例如,在你的另一个文件中),var MyApp 什么都不做。 = MyApp || {} 将变量设置为它已有的值(如果该值不是“falsy”)或新创建的对象({})。因此,如果您在每个文件中使用它,first 文件将创建变量并为其分配一个对象,所有其他文件将使用已经存在的对象。
  • 非常感谢,这太有用了!!以后我会一直这样做。
【解决方案2】:

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

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

这样当您从file_a.js 调用date_of_birth('a', 'b', 30) 时,它已经通过file_b.js 呈现。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 完美,谢谢!这就是解决方案。
    • @RezaSaadati 不要忘记接受这个解决方案..!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2019-09-29
    • 2023-03-08
    • 2023-03-15
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多