Javascript 函数声明类型与函数表达式类型

Javascript 函数声明类型与函数表达式类型,javascript,node.js,Javascript,Node.js,在声明函数或将函数定义为变量赋值时,使用typeof函数会遇到一些令人困惑的问题。下面是一个示例代码: //This displays "undefined" console.log(typeof window['a']); //This displays "function" console.log(typeof window['b']); function a() {}; b = function() {}; 编辑:这与吊装无

在声明函数或将函数定义为变量赋值时,使用typeof函数会遇到一些令人困惑的问题。下面是一个示例代码:

     //This displays "undefined"
     console.log(typeof window['a']);

     //This displays "function"
     console.log(typeof window['b']);

     function a() {};
     b = function() {};
编辑:这与吊装无关。我添加了以下等效的Node.js代码,该代码已完成,因此对程序中的其他内容没有疑问:

     function a() {}; 
     b = function() {}; 
     console.log(typeof global['a']);
     console.log(typeof global['b']);
输出为:

    undefined
    function
有人能根据上述更新解释为什么声明的函数在全局/窗口对象中没有条目吗

这不是重复的。当函数被声明为函数或变量赋值时,其他问题没有解决有关typeof返回值的具体问题。

功能减速

当您定义一个函数时,它将被提升(不仅是名称,还包括它的定义),您甚至可以在编译器到达(在执行上下文期间)定义它的行之前访问它

函数表达式

定义函数表达式时,变量将被提升,其值为
undefined
,只有在定义该变量的行之后(在执行上下文期间),才能访问该函数

console.log(窗口类型['a']);
console.log(窗口类型['b']);
函数a(){返回'a'};

b=函数(){return'b'}这是
函数声明
函数表达式
的一种情况

功能声明

声明的函数“保存以备将来使用”,并将在稍后调用(调用)时执行。 正如变量声明必须以“var”开头一样,函数声明也必须以“Function”开头

 function a() {...};
这就是为什么typeof a返回未定义的
,因为它还没有被使用

函数表达式

函数表达式可以存储在变量中:

 b = function {...};
函数表达式存储在变量中后,该变量可以用作函数。存储在变量中的函数不需要函数名。它们总是使用变量名调用(调用)

当您执行
typeof b
:它作为
函数
,因为它已经存储在窗口变量中


有关详细信息,您可以阅读此

这称为提升:无法复制。@Jonaswillms请参阅更新。这是重复的,提升确实解释了这种行为。至于为什么你的第二个代码片段不起作用,那是一个单独的问题:
a
不是一个全局变量-请看。现在你混合了更多的东西<代码>全局
窗口
有根本的不同。我仍然无法重现你的第一个例子。但是,这不是与OP报告的相反吗。他们说他们得到了提升函数名的
未定义的
。@code-Maniac请查看我的update@RTC现在这是完全不同于原来发布的一个,因为bergi已经提供了一个dup目标,请参阅我的更新