2011-10-02 80 views
5

我正在使用Node.js.爲什麼我的刪除函數在Node.js中不是typeof「undefined」?

我「和」功能被刪除後,我希望將typeof(總和)返回「不確定」,但事實並非如此。

// functions are data in Javascript 

var sum = function (a,b) { return a + b; } 
var add = sum; 
delete sum; 
console.log (typeof sum); // should return undefined 
console.log (typeof add); // should return function 
console.log (add(1,2)); // should return 3 

我想它應該返回:

undefined 
function 
3 

而是將其返回:

function 
function 
3 
+2

它返回什麼?函數,我假設,但只是檢查。 –

+0

它適用於我(在Firebug中)。另外,你錯過了';'。 – SLaks

+1

@SLaks - 當你說「它對我有效」時,這意味着什麼? –

回答

12

你不應該使用的標識符delete運營商(在範圍變量,函數 - 如sum - 或函數參數)。

delete運算符的用途是刪除對象的屬性

當您在後臺聲明變量函數聲明或函數參數時,這些標識符實際上是屬於它們聲明的當前範圍的environment record的屬性。

這些屬性在內部明確定義爲不可配置,它們不能被刪除。此外,delete操作者的使用已經使misunderstanded上ES5嚴格模式,其上標識的使用已經完全禁止,delete sum;應該拋出一個ReferenceError

編輯

由於@SLacks在問題的評論所指出的,delete操作者從Firebug的控制檯標識符的工作,那是因爲Firebug的使用eval在控制檯中執行代碼,你輸入和通過eval執行在代碼實例化標識符的可變環境綁定,是可變,這意味着它們可以被刪除,這是可能是允許程序員刪除在運行時動態聲明與EVAL變量,例如:

eval('var sum = function() {}'); 
typeof sum; // "function" 
delete sum; // true 
typeof sum; // "undefined" 

你可以看到,這也恰好是如何在控制檯上:

firebug-eval-code

這就是你正在閱讀的書可能是發生了什麼事,筆者提出基於eval在控制檯上他的測試。

11

delete僅用於刪除對象符號的性質,而不是刪除聲明的變量每this article

您發佈的片段是有幾乎完全一樣,你在這裏就把它。

編輯:以上引用的同一條闡明以及出現在螢火蟲在this section不一致。相關摘錄:

控制檯中的所有文本似乎都被解析並執行爲Eval代碼,而不是全局函數或函數。顯然,任何聲明的變量結束 起來作爲屬性沒有DontDelete,因此可以很容易地刪除。要 意識到定期全局代碼和螢火蟲 控制檯之間的這些分歧。

+0

您所指的文章指的是我提到的同一本書 – EhevuTov

+0

@EhevuTov:我意識到從你對這個問題的評論 –

相關問題