2014-03-26 167 views
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(){})

我是什么非常好奇,也很困惑! 谢谢!

+1

['message'是您想要在警报对话框中显示的可选字符串**,或者,也可以是转换为字符串并显示**的对象。](https://developer.mozilla .org/en-US/docs/Web/API/Window.alert) – DCoder

+0

*“我认为它可能是javascript的一个功能,它会提醒任何文本而不用引号”*通过这种逻辑,输出应该是'tobealerted'。 –

回答

0

功能仅仅是另一种类型的Javascript对象,所以:使用.toString()方法,它返回函数体为对象

alert(tobealerted); 

警报的功能对象本身:

alert(tobealerted()); 

警报功能的结果,但类型为function

if等语句不是对象,但函数的完整定义声明了一个对象。所以你可以提醒函数而不是if声明。

5

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

正如其他人所指出的,window.alert()仅显示String对象并触发任何其他类型对象的toString()函数。它期望您将其馈入的任何东西都是对象或对象的引用。
这就是当你试图提醒那些语句时发生的事情;它假设if等是变量名称,但它找不到该名称的任何引用。

3

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

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

不能调用上if/for/whiletoString()那些表现不解析为值。

0

如果你想报警返回一个值,它必须在这样的行情:

警报(“!工作”);

如果你希望它显示一个函数的返回值,它必须作为函数调用:

警报(tobealerted());

0

如果你调用一个没有括号的函数,你基本上要求函数的定义,并且因为函数是一流的,它可以让你把它分配给一个变量。

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

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