TypeError (intermediate value)(…) 不是 JS 中的函数
TypeError (intermediate value)(…) is not a function in JS
当我们忘记在函数声明和立即调用的函数表达式之间放置分号时,就会发生“TypeError: (intermediate value)(…) is not a function”错误。
要解决该错误,请在函数声明的右花括号后添加一个分号。
下面是错误如何发生的示例。
索引.js
// ⛔️ TypeError: (intermediate value)(...) is not a function const logger = function () { console.log('hi'); } // 👈️ missing semicolon here (function () {})();
在右花括号后添加一个分号
要解决该错误,请在函数声明的右花括号后添加一个分号。
索引.js
// ✅ Works const logger = function () { console.log('hi'); }; (function () {})();
我们得到错误是因为下一行立即调用的函数表达式被解释为函数的参数列表logger
。
在实践中,logger
函数以函数作为参数被调用,并且logger
函数的返回值被再次调用导致错误。
在发生错误的行的开头添加一个分号
您也可以尝试在发生错误的行的开头放置一个分号。
索引.js
// ✅ Works const logger = function () { console.log('hi'); }; ;(function () {})();
在行首添加分号,有助于 JavaScript 理解这是一个单独的行,不应与上一行合并。
查看您的错误消息以了解错误发生的确切位置
如果您无法发现错误发生的位置,请查看浏览器控制台或终端(如果使用 Node.js)中的错误消息。
上面的截图显示错误发生在index.js
line 上的文件中21
。
必须以分号开头的行
JavaScript 解释器会尝试自动添加分号,但在某些情况下它无法做到。
例如,以括号(
、方括号[
或任何数学运算符开头的行必须以分号开头。
索引.js
// ✅ Works const logger = function () { console.log('hi'); } // 👈️ missing semicolon here ;(function () {})(); // 👈️ line begins with semi colon
这仅适用于前一条语句不以分号结尾的情况。
例如,这是完全有效的语法。
索引.js
const logger = function () { console.log('hi'); }; // 👈️ semicolon here (function () {})(); // 👈️ line doesn't begin with semicolon
前面的语句以分号结尾,因此以括号开头的行不必以分号开头。
如果两个分号都丢失,JavaScript 解释器会假定我们正在尝试调用该函数(使用括号()
),将另一个函数作为参数传递给它。
使用super
关键字而不是使用this
这是错误如何发生的另一个示例。
索引.js
const obj = { getNum() { return 5; }, sum(a) { // ⛔️ TypeError: (intermediate value).getNum is not a function return a + super.getNum(); }, }; console.log(obj.sum(10));
我们有一个 TypeError 因为我们使用super()
关键字而不是使用
this
。
索引.js
const obj = { getNum() { return 5; }, sum(a) { // ✅ Works return a + this.getNum(); }, }; console.log(obj.sum(10));
该值称为“中间值”,因为调用函数不会产生表达式的最终结果。我们稍后将存储在变量中的值相加以获得最终结果。
getNum
a
确保仅在发生错误的行上调用有效函数。
有一组额外的括号,例如sum()()
也可能导致错误。