0

我正在尝试警报,但警报没有按我预期的那样工作,请看以下几行:

var tobealerted = function(){return 'worked!'};

现在当我提醒这一点时:

alert(tobealerted());

这会很好用!现在

alert(tobealerted);

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

alert(worked!)

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

alert(function(){})

你知道它警告了什么function(){}!然后我认为警报只允许在不带引号的情况下提醒此类声明。然后又写道:

alert(if(){}) //if is not defined
alert(for(){}) //for is not defined
alert(while(){}) //while is not define

但是这些对这个不起作用我搜索并找到了一些东西,从我的搜索中我找到了这个

函数是第一类对象

并根据维基百科:

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

所以我的问题是

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

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

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

4

5 回答 5

5

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

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

于 2014-03-26T13:04:34.883 回答
3

alert将其参数转换为字符串。就这样。

> x = function() { }
function () { }
> x.toString()
"function () { }"

您不能toString()if/ for/上调用,while因为这些表达式不会解析为值。

于 2014-03-26T13:05:02.183 回答
0

如果您希望警报返回一个值,则它必须在引号中,如下所示:

alert('成功了!');

如果您希望它显示从函数返回的值,则必须将其作为函数调用:

警报(tobealerted());

于 2014-03-26T13:07:08.593 回答
0

函数只是 Javascript 中的另一种对象,所以:

alert(tobealerted());

提醒函数结果,但是:

alert(tobealerted);

.toString()使用返回类型对象的函数体的方法警告函数对象本身function

诸如此类的语句if不是对象,而是函数的完整定义声明了一个对象。例如,您可以使用警报功能而不是if声明。

于 2014-03-26T13:07:47.533 回答
0

如果你调用一个没有括号的函数,你基本上是在询问函数的定义,因为函数是一等的,它允许你将它分配给一个变量。

if/for/while 是条件运算符,因此它们的工作方式与用户定义的函数不同。它们有一个非常具体的用途,并不意味着被覆盖。

当您尝试alert(function(){});时,它与您尝试将函数分配给变量没有什么不同。函数定义已存储,但您实际上并未调用该函数。现在,如果您这样做了alert(function(){}());,您实际上会调用该函数并且它会发出警报undefined。这完全是定义与调用的问题。

于 2014-03-26T13:13:38.100 回答