为什么我的JavaScript函数有时“未定义”?

我打电话给我的JavaScript函数。 为什么有时在定义时出现“myFunction未定义”的错误?

例如。 即使在这个例子中,我偶尔会得到'copyArray没有定义':

function copyArray( pa ) { var la = []; for (var i=0; i < pa.length; i++) la.push( pa[i] ); return la; } Function.prototype.bind = function( po ) { var __method = this; var __args = []; // Sometimes errors -- in practice I inline the function as a workaround. __args = copyArray( arguments ); return function() { /* bind logic omitted for brevity */ } } 

正如你所看到的,copyArray是在那里定义的,所以这不能关于脚本文件的加载顺序。

我已经得到了这种情况下,更难以解决的地方,调用函数位于另一个文件, 应该被调用函数后加载。 但这是我能提出的最简单的情况,而且似乎是同样的问题。

它不是100%的时间发生,所以我怀疑某种负载时序相关的问题。 但我不知道是什么。

@Hojou:这是问题的一部分。 现在我得到这个错误的函数本身就是我的addLoadEvent,它基本上是公共库函数的标准版本。

@詹姆斯:我明白,并没有在函数中的语法错误。 在这种情况下,还会报告语法错误。 在这种情况下,我只得到'未定义'的错误。

@David:这种情况下的脚本驻留在一个外部文件中,该文件使用普通的<script src =“file.js”> </ script>方法在页面的head部分中引用。

@Douglas:有趣的想法,但是如果是这样的话,我们怎么可以自信地调用一个用户定义的函数呢? 无论如何,我试过这个,但是没有奏效。

@sk:这个技术已经在浏览器上testing过了,基本上从原型库复制过来。

如果您只是在页面上包含脚本,就不可能发生这种情况。

JavaScript代码开始执行时,“copyArray”函数应该始终可用,无论它是在声明之前还是之后声明 – 除非您使用依赖库dynamic加载JavaScript文件。 如果是这样的话,那么时间上就会有各种各样的问题。

我没有将这个function识别为最新版本的Firefox for Linux,尽pipeChromium正在处理它。

发生在我的情况是,我有一个以前的SCRIPT块,在定义function问题的块之前,说明如下:

 <SCRIPT src="mycode.js"/> 

(也就是说,没有结束标签。)

我不得不以下面的方式重新声明这个块。

 <SCRIPT src="mycode.js"></SCRIPT> 

然后接下来的工作很好…怪异的?

我的猜测是,在调用方法的时候,文档不会被完全加载。 在文档就绪事件之后执行代码。

用JSLintvalidation你的代码。 通常会发现很多小错误,所以“JSLint可能会伤害你的感受”这个警告是非常有用的。 =)

函数中的语法错误 – 或者上面的代码中的语法错误 – 可能导致它未定义。

这并不能解决你原来的问题,但是你总是可以用下面的代码来replace对copyArray()的调用:

 __args = Array.prototype.slice.call(arguments); 

来自Google的更多信息。

我已经在以下浏览器中testing了上述内容:IE6,7&8B2,Firefox 2.0.0.17&3.0.3,Opera 9.52,Safari 3.1.2和Google Chrome(无论本文最新版本是什么),它适用于所有浏览器。

如果你正在改变内置的“函数”对象的原型,那么可能通过修改一个基本的内置对象来运行浏览器错误或竞争条件。

在多个浏览器中testing以找出答案。

这可能已被纠正,但…显然firefox有一个caching问题,这是javascriptfunction不被识别的原因..我真的不知道具体情况,但如果你清除你的caching,将解决问题(直到你的caching已满…不是一个好的解决scheme)..我一直在四处看看,看看如果Firefox有一个真正的解决scheme,但迄今没有…哦,不是所有的版本,我认为这可能是唯一的在一些3.6.x版本,不知道…

使用匿名函数来保护您的本地符号表。 就像是:

 (function() { function copyArray(pa) { // Details } Function.prototype.bind = function ( po ) { __args = copyArray( arguments ); } })(); 

这将创build一个闭包,在本地符号表中包含你的函数,当你调用这个函数的时候,你将不必依赖它在全局命名空间中的可用性。

使用框架时可能会发生这种情况。 在一个框架中,我的variables和方法被定义。 另一方面,他们不是。 当使用debugging器并看到我定义的variables时,特别令人困惑,然后在框架内的断点处未定义。

恐怕,当你添加一个新的方法到一个函数类(通过prtotyping),你实际上将它添加到所有声明的函数,以及你的copyArray()。 结果你的copyArray()函数被recursion地自引用。 即那里应该存在copyArray()。bind()方法,这是自己调用。

在这种情况下,某些浏览器可能会阻止您创build此类引用循环,并触发“function未定义”错误。

在这种情况下,内联代码将是更好的解决scheme。

我觉得你的javascript代码应该放在标签之间,需要文件加载

通过删除“asynchronous”负载来解决:

  <script type="text/javascript" src="{% static 'js/my_js_file.js' %}" async></script> 

更改为:

  <script type="text/javascript" src="{% static 'js/my_js_file.js' %}"></script> 

确保你的函数不是无意的嵌套函数,比如它是在处理文档就绪事件的函数中定义的。