javascript中警报功能的意外行为

时间:2014-03-26 13:01:36

标签: javascript function alert first-class

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

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(){})

中的任何内容

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

5 个答案:

答案 0 :(得分:5)

你自己给出了答案。函数是对象和as such have toString() functions。您提供的其他示例包括statements,而不是objects

如其他人所述,window.alert()仅显示String个对象,并触发任何其他类型对象的toString()功能。它希望你喂它的任何东西都是对象或对象的引用 这是当你试图提醒那些陈述时发生的事情;假设if等是变量名称,但它无法通过该名称找到任何引用。

答案 1 :(得分:3)

alert将其参数转换为字符串。这就是全部。

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

您无法在toString() / if / for上调用while,因为这些表达式无法解析为值。

答案 2 :(得分:0)

如果您希望警报返回值,则必须使用以下引号:

警报('工作'!);

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

警报(tobealerted());

答案 3 :(得分:0)

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

alert(tobealerted());

警告功能结果,但是:

alert(tobealerted);

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

if之类的语句不是对象,但函数的完整定义声明了一个对象。因此,您可以提醒函数而不是if语句。

答案 4 :(得分:0)

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

if / for / while是条件运算符,因此它们不像用户定义的函数那样工作。它们具有非常特殊的用途,并不意味着过度使用。

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