跳過導覽列

O3noBLOG

A Happy(?)Designer ~~

單篇彙整

拾貳 29

var foo = foo || {};

foo = foo || {};

這樣的寫法大家一定不陌生,如果 ab 有值的話就繼續用,不然就讓他成為空物件。通常會用到的地方有兩種,函式設定參數預設值,或是跨檔案的公用函式庫,這種時候會把變數放在 global scope 下,也就是全域變數,要宣告全域變數的話不用 var,直接變數名稱就可以了,就像上面那段 code,不過實際上,這樣寫是會出錯的,沒寫 var 的話,第二個 foo 會跑出 foo 尚未定義的錯誤,所以寫成標題那樣是比較沒問題的,不過有時候,程式碼會全部包在一個 function scope 裡面,避免安全的問題,但是在這個 scope 裡面用 var 宣告變數的話,變數又不會是全域的,這時其實加上 window 就可以了:

(function () {
foo = window.foo || {};
})();

也可以用 if 判斷:

(function () {
if (! window.foo ) { window.foo = {} }
})();

最後我還發現一件趣事,大家可以猜猜看下面的 code 會不會有錯誤:

(function () {
foo = undefined;
foo = foo || {};
})()

引用(http://othree.net/cgi-bin/mt/mt-tb.cgi/602)

目前無人引用。

迴響(發表你的迴響)

  1. 1由 Clydewu 在 2009-12-30 02:41:17 發表:

    我猜是不會,實際上好像也是不會
    原因是foo = undefined時,由於是"給值"的動作
    所以js會自動替不存在的值宣告並給值undefined,在把我們指定的undefined給值一次。
    所以foo=foo||{}時第二個foo不會不存在。

    如果直接執行foo=foo||{},由於是判斷,而不是給值動作所以不會有上述的自動宣告

    這樣說對嘛?

  2. 2怿飞在 2009-12-30 13:24:27 發表:

    其实对于未定义变量只可写入,但不可读取。对于读操作,如果一直追溯到全局执行环境的 scriptObject 上都找不到,就会产生运行期错误。

  3. 3othree.net在 2009-12-31 10:05:44 發表:

    @Clydewu 有趣的是,這樣給值下去,變得無法判斷他是不是真的 undefined ,雖然實際上不一樣。

    @怿飞 我的問題是,為什麼前面加上 var 宣告就不會有錯誤了。

發表迴響

如果欲使用OpenID,請開啟瀏覽器的JavaScript功能。

accesskey:P


其它資訊

關於本文章

var foo = foo || {};發表於2009-12-29,文章類別為SCRIPT,截至目前為止共有0篇文章引用此文、3篇讀者迴響,你可以為此篇文章留下你的想法,或是訂閱讀者迴響的RSS

關於本網站

本網站是O3(othree)的個人部落格,主要內容為網路標準、網頁設計,穿插些ACG心得和敗家紀錄,如果需要聯絡我請寄信到

Google Friend Connect


認證、授權

XHTML, CSS,WCAG,創用CC 姓名標示