typeof函数声明与函数表达式

时间:2019-07-07 15:49:41

标签: javascript node.js

在声明函数或将函数定义为变量赋值时,使用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返回值的特定问题。

3 个答案:

答案 0 :(得分:1)

  

功能减速

定义函数时,它会被吊起(不仅是名称,而且是它的定义),甚至在编译器到达(在执行上下文期间)到达定义它的行之前,您就可以访问它。

  

函数表达式

当您定义函数表达式时,该变量将被吊起并且其值为undefined,只有在定义该行之后(在执行上下文中),您才可以访问该函数

console.log(typeof window['a']);
console.log(typeof window['b']);

function a() { return 'a'};
b = function(){ return 'b'};

答案 1 :(得分:0)

这是static string Transform(string input) { if (input == null) throw new ArgumentNullException(nameof(input)); var builder = new StringBuilder(); var lines = input.Split(new [] { Environment.NewLine }, StringSplitOptions.None); foreach (var line in lines) { builder.AppendLine(line); var items = line.Split('|'); foreach (var item in items) { builder.AppendLine(item.Trim()); } } return builder.ToString(); } string text = File.ReadAllText(openFileDialog.FileName, Encoding.GetEncoding(1252)); txtEditor.Text = Transform(text); Function declaration的情况。

功能声明

已声明的函数“已保存以备后用”,并且在调用(调用)该函数时将稍后执行。 就像变量声明必须以“ var”开头一样,函数声明也必须以“ function”开头

Function expression

这就是为什么typeof返回 function a() {...}; 的原因,因为它尚未被使用。

函数表达式

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

undefined

将函数表达式存储在变量中之后,该变量可以用作函数。存储在变量中的函数不需要函数名。始终使用变量名来调用(调用)它们。

在执行 b = function {...}; 时:它以typeof b的形式出现,因为它已经存储在窗口变量中。

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

答案 2 :(得分:-1)

通过“ var”声明变量时,该变量会自动添加为窗口对象中的字段