Uncaught TypeError: areFieldsSet is not a function

Uncaught TypeError: areFieldsSet is not a function

我的 JS 代码为:

    $(function () { //line-1
     if(window.location.search.length >1){
    //doSomething ;
     areFieldsSet(); //call this function
    } //end of if 

    var areFieldsSet = function(){
    //do something
    }
    //do many things
   } // end of line-1 function

现在,当我尝试按照问题标题中的描述引用 areFieldsSet 函数时出现错误。 我哪里错了?

问题是你在调用函数后定义它。

JavaScript 做一些叫做 "hoisting" 的事情。看看这篇文章:Variable and Function Hoisting in JavaScript

规则有时会令人困惑,但基本上使用 function x() 符号的函数定义被隐式移到顶部,变量 definitions 也被移动,但是不是他们的初始化!

例如,var x = 5; 更往下的某处将像 var x; 写在代码 block/function 的开头一样工作,但 x = 5; 更往下。所以 x 会在赋值之前定义,但是值为 undefined.

因此,您有两个选择:要么将 areFieldsSet 函数移至调用它的位置上方,要么将其从 var areFieldsSet = function() 更改为仅 function areFieldsSet(),这将使它有资格进行提升(而不仅仅是变量提升)。

Javascript 代码分两个阶段工作。

第一阶段 - 它使用 var 关键字声明所有变量(仅声明,不初始化)和所有函数声明( function F() {} )。

第二阶段 - 开始 运行。

在您的代码中,您有 函数表达式 ,而不是声明,因此当您尝试在行

中调用该函数时
  $(function () { //line-1
     if(window.location.search.length >1){
    //doSomething ;
     areFieldsSet(); //call this function
    } //end of if 

    var areFieldsSet = function(){
    //do something
    }
    //do many things
   }

JavaScript 引擎知道有一个名为 areFieldsSet 的变量(因为它是在第一阶段声明的),但是给它分配一个函数就可以了只有当您的代码将达到

var areFieldsSet = function(){
        //do something
        }

所以当你试图像函数一样调用它时,你会得到错误,因为 JavaScript 不知道它是一个函数。