你認為你很瞭解Javascript?,Javascript?
(翻譯不當之處請諒解)
來源:http://www.ido321.com/914.html
這裡有5個小指令碼,有助於你真正理解JavaScript核心–閉包和範圍。沒有在控制台運行之前,嘗試回答每個案例中會彈出什麼內容,然後你可以建立一個測試檔案去核對你的答案。你準備好了嗎?
1、
1: if (!("a" in window)) {
2: var a = 1;
3: }
4: alert(a);
2、
1: var a = 1,
2: b = function a(x) {
3: x && a(--x);
4: };
5: alert(a);
3、
1: function a(x) {
2: return x * 2;
3: }
4: var a;
5: alert(a);
4、
1: function b(x, y, a) {
2: arguments[2] = 10;
3: alert(a);
4: }
5: b(1, 2, 3);
5、
1: function a() {
2: alert(this);
3: }
4: a.call(null);
我的預測答案分別是:undefined、1、不知道、10、null
答案在本文末尾,看答案之前,你敢留下你的猜測嗎?
正確答案:1、undefined 2、1 3、function a(x){ return x * 2} 4、10 5、[object window]
來源:http://dmitry.baranovskiy.com/post/91403200
本以為自己很瞭解javascript中範圍,可好像不是這樣……解
樓主首先聲明了一個全域變數msg,在方法中又寫了一個var msg = "hello";
這句話並沒有改變全域變數msg的值,
因為setTimeout("alert(msg);",2000)中的msg的範圍是全域的所以列印出的值也是全域的,
如果樓主把var msg = "hello";改為 msg = "hello";
那麼列印的全域變數值才會變為你想要的hello
為何你的Javascript技術很爛?
它的低學習門檻讓很多人都稱它為學前指令碼語言,它另外一個讓人嘲笑的東西是動態語言的概念是偏偏使用了高標準的待用資料類型。其實,你和Javascript都站錯了立場,而現在,你讓Javascript很生氣。這裡有五個原因能說明你的Javascript技術很爛。1. 你沒有使用命名空間。是否還記得在大學裡老師告訴你不要在家庭作業裡使用全域變數?Javascript裡的全域變數的使用方法也不例外。Web網頁稍不留神就會變的混亂不堪、到處都是從互連網上各個角落裡找來的亂糟糟的相互侵犯的指令碼和指令碼庫。如果你把一個變數命名成loader(),那你是成心自找麻煩。如果你在無意識的情況下重載了一個函數,Javascript根本不會提醒你。你還把它叫做一種學前教育程式設計語言,還記得吧?我要說的是,你需要知道在做了這些後發生什麼情況。 function??derp() { alert(“one”); }function??derp() { alert(“two”); }derp();“two”,答案是“two”。並不是一定會這樣,它也可能是“one”。所以,把你所有的代碼都放在自己的命名空間裡,這很容易。下面是定義自己的命名空間的一個簡單做法。 var foospace={};foospace.derp=function() { alert(“one”); }function??derp() { alert(“two”); }foospace.derp();2. 你在變戲法,你把變數定義的東一個西一個。你使用莫名其妙的數字字母組合作為變數名是一個雙輸的結局。在40行的代碼塊了中尋找一個不帶任何錶意的字元變數,對於維護工作來說簡直是場噩夢。把對變數的第一次聲明混合到一個40行的代碼塊裡同樣也是一場噩夢。即使你自己遇到這樣的變數時,你也要不由的問自己:“這是在哪裡定義的?”,然後迅速的使用Ctrl+F組合在原始碼裡尋找這個變數最初定義的位置。不,不要這樣,相反,這是對Javascript的濫用,是一種愚蠢的做法。你應該始終把變數定義在它的使用範圍的頂部。並不能說因為這不是必須的,你就可以不這樣做。 function() {var a,??//descriptionb;??//description//process…}3. 你沒有理解Javascript的變數範圍。你是個天才的程式員,你吃的是C++、拉的是List。你知道什麼是變數範圍,你對你的變數有完全的控制,你就像太上皇似的的注視著它們。然而,Javascript卻在你的咖啡裡拉了一泡屎,並且大笑不止。 var herp=”one”;{var herp=”two”;}alert(herp);在這種情況下你得到的herp不是“one”,而是“two”。Javascript的變數有效範圍並不是跟其它語言一樣依賴於代碼塊。Javascript的變數範圍是以函數為基礎的。每個函數都有它自己的變數範圍,Javascript這一點上表現的很酷,根本不理睬這毫無意義的花括弧包起來的範圍。事實上,Javascript是如此的酷,以至於你甚至可以將變數範圍像命名空間或變數那樣進行傳遞。 4. 你以為Javascript的物件導向特徵只是嫁接而來的。Javascript,自從呱呱落地起,它就是一個物件導向的語言。所有的東西在Javascript裡都是對象,所有的!甚至數字和字元這樣的文字元號都可以通過它自身固有的構造器轉化成對象。跟其它物件導向的語言比起來,Javascript的不同之處在於......餘下全文>>