2014-03-26 220 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調用的問題。