2008-09-30 180 views
35

我打电话给我的JavaScript函数。为什么我有时得到错误'myFunction is not defined'定义的?为什么我的JavaScript函数有时“未定义”?

例如。我偶尔会即使在这个例子中“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,它基本上是公共库函数的标准版本。

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

@大卫:在这种情况下,脚本在于使用正常< SCRIPT SRC =“file.js” > < /脚本>在页的头部部分中引用的方法的外部文件。

@Douglas:有趣的想法,但如果是这种情况,我们如何有史以来有信心调用用户定义的函数?无论如何,我尝试过这种方式,但它不起作用。

@sk:这项技术已经过浏览器测试,基本上从Prototype库复制。

+3

只是出于好奇......在哪里你遇到这个错误进出正在执行脚本的页面帧/ IFRAME /弹出窗口? – Shog9 2008-09-30 17:11:13

+1

嗯......没有涉及的iframe或弹出窗口。 – harpo 2008-09-30 18:49:59

回答

7

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

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

+1

我一直无法重现 - 甚至是经验 - 这个问题,所以我会认为这是我的错误。 – harpo 2009-01-04 19:41:48

4

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

2

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

+4

如果是这样的话,它将无法工作。偶尔的故障不能用语法错误来解释。 – Tomalak 2008-09-30 16:49:08

0

使用匿名函数来保护您的本地符号表。喜欢的东西:

(function() { 
    function copyArray(pa) { 
     // Details 
    } 

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

这将创建一个封闭,其中包括在当地的符号表的功能,你将不必依赖于它是在全局命名空间,当你调用该函数。

2

如果你改变了内置的“功能”对象的原型很可能你正在运行到浏览器错误或竞争条件通过修改基本的内置对象。

在多个浏览器中测试以找出结果。

0

恐怕,当您向函数类(通过prtotyping)添加新方法时,实际上是将其添加到所有已声明的函数,以及您的copyArray()。结果你的copyArray()函数被递归地自引用。即应该存在调用自身的copyArray()。bind()方法。

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

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

2

这不会解决你原来的问题,但你总是可以替换为调用copyArray()

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

更多信息。

我已经在以下浏览器中测试了上述内容:IE6,7 & 8B2,Firefox 2.0.0.17 & 3.0.3,Opera 9.52,Safari for Windows 3.1.2和Google Chrome(无论最新版本在这篇文章的时间),它适用于所有浏览器。

+0

感谢您的提示。我可以在很多地方使用它。但是,我真的只是用这个函数作为例子。现在困扰我的那个完全不同。 – harpo 2008-09-30 18:48:55

4

JSLint验证您的代码。它通常会发现很多小错误,所以警告“JSLint可能会伤害你的感觉”是非常有用的。 =)

20

我没有被认识到了这个功能,如最新的Firefox定义为Linux,虽然铬是处理与它的罚款。

在我的情况下发生了什么事,我有一个前SCRIPT块,与问题定义的功能块之前,通过以下方式提出:

<SCRIPT src="mycode.js"/> 

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

我不得不用下面的方法重新声明这个块。

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

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

+3

我刚刚遇到了与IE9和Chrome 14相同的问题。后面的疼痛是...... – Joshua 2011-07-12 15:55:12

0

使用框架集时会发生这种情况。在一个框架中,定义了我的变量和方法。另一方面,他们没有。当使用调试器并查看我定义的变量时,它尤其令人困惑,然后在帧内的断点处未定义。

2

这可能已经得到纠正,但显然... Firefox有一个缓存的问题这是JavaScript的功能不被认可。我真的不知道具体的原因,但是,如果您清除高速缓存将修复问题(直到缓存已满再次...不是一个很好的解决方案)。我一直在四处寻找,看看Firefox有一个真正的解决了这个,但至今没有......哦,不是所有的版本,我想它可能只在一些3.6.x版本中,不确定...

0

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

-2

请确保您的函数是不是无意中嵌套函数,也就是说,它是在处理文档的功能定义就绪事件。

0

通过删除“异步”负载解决:

<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> 
相关问题