&引用;未捕获类型错误:未定义不是函数;在JavaScript代码块中

&引用;未捕获类型错误:未定义不是函数;在JavaScript代码块中,javascript,Javascript,在我的html页面中有一个如下所示的JavaScript代码块。当我通过加载页面来运行它时。在我的浏览器控制台上,我得到了低于输出的结果 outer world Uncaught TypeError: undefined is not a function 正如您在代码片段中看到的,我没有在代码中的任何地方执行名为b的函数。但是在运行代码时,该函数的输出附带了一个未定义的错误,它不是一个我在代码块的任何地方都找不到的函数错误 为了给这个场景添加更多内容,当我删除代码中的任何一个部分时,都没有

在我的html页面中有一个如下所示的JavaScript代码块。当我通过加载页面来运行它时。在我的浏览器控制台上,我得到了低于输出的结果

outer world 
Uncaught TypeError: undefined is not a function
正如您在代码片段中看到的,我没有在代码中的任何地方执行名为
b
的函数。但是在运行代码时,该函数的输出附带了一个
未定义的错误,它不是一个我在代码块的任何地方都找不到的函数错误

为了给这个场景添加更多内容,当我删除代码中的任何一个部分时,都没有日志。就是。如果我从代码中删除b的初始化,那么就没有错误和输出。此外,如果我删除了自执行功能块,则不会出现日志或错误。b的初始化行确实缺少分号。但是什么诱使它提供这样的输出让我困惑。你能帮我找出这种行为的原因吗

你能帮我理解为什么会这样吗?
var b=function(){
console.log(“外部世界”);
}
(函数(){

})();在var声明后需要一个分号,顺便说一下,请删除log和(


声明
b
后缺少a
。以下代码与您拥有的代码相同

var b = function() {
   console.log ('outer world');
}(function() {})();
如果没有
b将自动执行,并将空函数作为参数。之后,它将再次自执行;但是,由于b不返回函数,因此会出现异常

我建议在你成为js忍者之前不要跳过
)。保持
b
在内部,以避免全球范围的污染

(function () {
    "use strict";

    var b = function () {
        console.log("hi");
    };
    // other code
}());

如果不需要分号,请在自运行函数之前添加运算符

var b = function () { console.log('outer world') }
;(function() { /* ... */ }())
ES6更新:

(() => {
  const b = () => console.log('hi')
  // ...
})()

当我们放下分号时,你能解释一下它是如何给出这样的输出的吗。在我的代码中没有的背景中发生了什么?。我在任何时候都不能执行b,读取@kornieff的答案。它将尝试执行您定义的输出console.log的函数,并将新匿名函数的参数发送给它,然后在最后您尝试执行一个不存在的函数,因为此时您拥有的不再是函数。@RickardStaaf:+1。谢谢你的回答。然而,科尼夫的解释正是我想要的。很抱歉,无法用更好的方式表达我的问题。@RickardStaaf,+1,因为它比我快:)最后,一个例子,Javascript不会自动在看起来直观的地方插入分号来添加它!任何以
[
需要
才能开始。是的。这有助于我理解这个场景。你能把Barmar在Rickard Staaf的回答中提供的链接合并起来吗。这有助于我进一步理解它。@mithunsatheesh,很可能列出了所有的案例。我确实学到了一些。但问题是,尽管跳过
会让代码变得很糟糕k稍微干净一点,调试肯定会花费更多的时间和精力。
(() => {
  const b = () => console.log('hi')
  // ...
})()