在声明函数或将函数定义为变量赋值时,使用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返回值的特定问题。
答案 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”声明变量时,该变量会自动添加为窗口对象中的字段