javascript中警报功能的意外行为

ann*_*nni 0 javascript alert function first-class

我正在试验警报,但警报不起作用,因为我预期看到下面的线条:

var tobealerted = function(){return 'worked!'};
Run Code Online (Sandbox Code Playgroud)

现在当我提醒这个:

alert(tobealerted());
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作!现在

alert(tobealerted);
Run Code Online (Sandbox Code Playgroud)

在这个我删除括号.现在它警告function(){return "worked"}不是worked! 现在我认为它可能是javascript的一个功能,它会提醒任何文本,而不是在引号然后我写道:

alert(worked!)
Run Code Online (Sandbox Code Playgroud)

但谷歌控制台抛出异常worked!是未定义的,所以我的想法是错误的.然后我又写了这个

alert(function(){})
Run Code Online (Sandbox Code Playgroud)

而且你知道它的警告function(){}!然后我认为警报只允许在没有引号的情况下发出警告.然后又写道:

alert(if(){}) //if is not defined
alert(for(){}) //for is not defined
alert(while(){}) //while is not define
Run Code Online (Sandbox Code Playgroud)

但这些对我来说没有用,我搜索并发现了一些东西,从我的搜索中我发现了这个

函数是第一类对象

并根据维基百科:

在计算机科学中,如果将编程语言视为一等公民,则称其具有一流的功能.具体来说,这意味着该语言支持将函数作为参数传递给其他函数,将它们作为其他函数的值返回,并将它们分配给变量或将它们存储在数据结构中

所以我的问题是

为什么alert功能只允许function (){}被警告而不是其他人

如果你认为这是因为该函数是一流的对象,那么我不这么认为,因为我没有将这个函数(最后一个)分配给任何变量,它既不返回任何内容 alert(function(){})

我非常好奇也很困惑!谢谢!

gpg*_*kko 5

你自己给出了答案.函数是对象,因此具有toString()函数.你提供的其他例子statements不是objects.

如其他人所指出的,window.alert()仅显示String对象并触发toString()任何其他类型对象的功能.它期望您提供的任何内容都是对象或对象的引用.
这是当你试图提醒那些陈述时发生的事情; 它假设if等是变量名,但它找不到该名称的任何引用.