我正在试验警报,但警告不起作用,因为我预期看到下面的线:
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(){})
我非常好奇也很困惑! 谢谢!
答案 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调用的问题。