Javascript 所有函数表达式突然都无法识别为函数

Javascript 所有函数表达式突然都无法识别为函数,javascript,function,function-declaration,function-expression,Javascript,Function,Function Declaration,Function Expression,我有一个包含许多函数表达式的大型javascript文件。控制台突然出现以下错误: 在IE中 在Firefox中 TypeError: myFunc is not a function 这就是我调用函数的方式: myFunc(); myFunc = function() { //do stuff } 这就是功能: myFunc(); myFunc = function() { //do stuff } 所有函数表达式都会发生这种情况。如果我将一个函数声明更改为一个函数声明,它可

我有一个包含许多函数表达式的大型javascript文件。控制台突然出现以下错误:

在IE中

在Firefox中

TypeError: myFunc is not a function
这就是我调用函数的方式:

myFunc();
myFunc = function() {
  //do stuff
}
这就是功能:

myFunc();
myFunc = function() {
  //do stuff
}

所有函数表达式都会发生这种情况。如果我将一个函数声明更改为一个函数声明,它可以工作,但在它内部的其他函数表达式调用中将失败。怎么回事?

可能性1

如果在定义函数表达式之前调用该函数表达式,则会出现此错误。但是,如果将其转换为函数声明,函数声明将被提升到作用域的顶部,并且可以在实际声明发生之前或之后调用。因此:

functionFoo();
var functionFoo = function() {

};
将给出此错误,因为您试图在定义函数之前调用该函数。但是:

functionFoo();
function functionFoo() {

}
将起作用,因为实际的函数声明被提升到范围的顶部,并且可以在任何地方使用

可能性2

如果从定义函数表达式的范围之外的其他范围调用函数表达式,则会出现此错误。函数表达式与其他变量一样,只能在定义的范围内使用。因此:

$( document ).ready( function() {
   var functionFoo = function() {

   };
} );
functionFoo();
将给您一个错误,因为函数的定义发生在与调用不同的范围内。但是:

$( document ).ready( function() {
   var functionFoo = function() {

   };
   functionFoo();
} );

将正常工作,因为定义和调用都发生在同一个作用域中。

那么,在不调用
myFunc
的情况下,是否仍会出现错误?还是只在您调用它之后才会发生?@ianpgall如果我在页面上注释掉对函数表达式的所有调用,则不会出现错误。所以不,“突然控制台给我以下错误…”突然?不,有些事改变了。查找您所更改的内容。@SteveWellens我的文件与在其他环境中正常工作的文件相同。使用Visual Studio中的一个工具对它们进行比较。
myFunc=function(){
function myFunc(){
之间的区别在于作用域:后者声明
myFunc
,前者不需要这样做。这可能会影响名称解析。因此,如果我有
myFunc=function(){};
在我包含的js文件中,并调用
$(document).ready(function(){myFunc();})
在包含该js文件的页面中,由于作用域的原因,我将得到此错误?我注意到您在每个函数表达式中使用了
var
,mdn也是如此。这是必需的吗?@第一个问题的功能,这取决于。如果您在全局作用域中定义函数表达式,并且在执行之前加载外部javascriptM准备好了,那么它就可以工作了,因为ready函数继承了父函数(全局)定义它的范围。如果一段代码依赖于一个外部文件中的另一段代码依赖于另一个外部文件中的另一段代码,最好使用与AMD兼容的加载程序,如require.js,在运行依赖于它们的代码之前,它会等待所有依赖项加载完毕。@Feature对于第二个问题,它在定义变量时使用var关键字是一种很好的做法。如果您在全局范围内,则使用或不使用var关键字没有区别。如果您在函数范围内,则“var”将在函数范围内创建局部变量,而“no var”将查找作用域链,直到找到变量或到达全局作用域(此时将创建它)。