在 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 is not a function
当我打电话时console.log(window.date_of_birth);
,我得到undefined。
在我使用的两个文件中:
$(document).ready(function() {
});
为什么我的函数没有定义?
在 2020 年末,您将使用模块来执行此操作,要么依赖于所有现代主要浏览器中都存在的本机支持,要么依赖于 Webpack 或 Rollup.js 等使用模块语法获取代码并将其捆绑到旧浏览器的捆绑器。
使用模块语法,在简单的情况下,您可以导出要提供的函数:
export function date_of_birth(/*...*/) {
// ...
}
这是一个导出的函数声明,它创建了一个命名的导出。另一个模块中想要使用该函数的代码将导入该函数:
import { date_of_birth } from "./module-name.js";
这个主题还有很多,更多关于 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
回调在那个文件(你正在定义函数的地方)中的回调之前运行。
如何修复:
为您的应用选择一个唯一标识符,例如MyApp
。(它不必是全局唯一的,它只需要 A)不是在浏览器环境中定义的东西,B)在未来的某个时候可能不会在浏览器环境中定义,以及 C)不是由您使用的任何库定义。)例如,jQuery 使用jQuery
.
在定义此函数的文件中,执行以下操作:
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() { /*...*/ };
// ...
})();
在您使用它的文件中,像这样使用它:
MyApp.date_of_birth(/*...*/);
确保定义函数的文件在使用它的文件之前,将两者都放在 HTML 的末尾(就在结束</body>
标记之前),并去掉ready
回调(没有必要;如果脚本在文件,东西已经准备好了)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句