※任意地點的script
<!DOCTYPE html> <script>alert('a');</script> <html> <script>alert('b');</script> <head> <script>alert('c');</script> </head> <script>alert('d');</script> <body> <script>alert('e');</script> </body> <script>alert('f');</script> </html> <script>alert('g');</script>
※以上七個地方都可以,但真正只能放在 head 和 body 裡而已,因為瀏覽器會將 abcd 放在 head 裡;efg 放在 body 裡
※同script區塊
<script> alert(a); var a = 'a'; </script>
※大部分的程式語言都一定要宣告,不能就會編譯錯誤,但js有預編譯的功能,能將變數和function先編譯好,但只有等號的左邊會先編譯好,所以會印出undefined(不管有沒有給值都一樣)
※只有 var 可以,const、let都會編譯錯誤,就算加上 use strict 結果也不會改變
雖然不宣告 var 也是 全域的意思,但在這裡不加 var 也是會錯,所以總規一句就是只宣告 var 關鍵字才會
※不同script區塊
<script> alert(a); </script> <script> var a = 'a'; </script>
※js是以一個script區塊執行完才會執行下一個script區塊,所以雖然只是將最後一行多個script包起來,這時候就會有大部分的程式語言的錯誤訊息,找不到物件
※預編譯 function
a(); function a(){ alert('a'); } b(); var b = new Function('alert("b");'); c(); var c = function(){ alert('c'); } d(); var d = () => { alert('d'); }
※預編譯 function,分成有沒有「()」
1.無圓括號
如果印a可以印出整個 function 的內容
而 b c d 是 undefined
2.有圓括號
a()會印出a;而b~d會出現語法錯誤:xxx is not a function
3.以上兩點 加上 use strict 不會改變其結果
※d是 lambda 的寫法,用 IE11 還是不支援
※注意名稱會被覆蓋的問題,如下:
function x() { return 22; } var x = 10; console.log(x); // 10
※這裡的 function 的寫法,會被有宣告 var x 開頭的覆蓋,方法屬性都一樣
※總結:
function a(){}這種的會先提前,再來是有宣告 var 關鍵字的提前,但是不包括 = 之後的部分,其中名稱一樣的會後者蓋前者,這裡講的是全域作用域,函數作用域裡也是一樣的
練習
var x1 = 'xxx'; function fun1(){ console.log(x1); // xxx } fun1(); console.log("==============="); var x2 = 'xxx'; function fun2(){ console.log(x2); // undefined var x2 = 'ooo'; // 此為函數裡的x } fun2(); console.log(x2); // xxx console.log("==============="); var x3 = 'xxx'; function fun3(){ console.log(x3); // xxx x3 = 'ooo'; } fun3(); console.log(x3); // ooo console.log("==============="); var x4 = 'xxx'; function fun4(x4){ // 參數裡的變數為函數的var console.log(x4); // undefined x4 = 'ooo'; } fun4(); console.log(x4); // xxx console.log("==============="); var x5 = 'xxx'; function fun5(x5){ console.log(x5); // zzz x5 = 'ooo'; } fun5('zzz'); console.log(x5); // xxx
※多個window.onload
window.onload是全部的頁面載入完才執行的載入是從上到下,所以如果沒有用這個將程式碼包起來,有可能會找不到物件,因為它還沒生成,如果是寫在最下面那就沒有關係
<script> window.onload = function(){alert('a');} window.onload = function(){alert('b');} </script> <script> window.onload = function(){alert('c');} </script>
※雖然可以寫多個,但只會直行最後一個,後者蓋前者,所以會印出c
※同名
window.onload = function(){ aaa(); }; // A var aaa = function(){ alert('a1'); } // B function aaa(){ alert('a2'); }
※如果一個是屬性、一個是方法,不管順序,會以屬性為主
※如果有多個同名的A或B的寫法,那會後者蓋前者
※如果像上面A和B都有,會以宣告變數的A為主(A包括其他三種以var開頭的寫法)
※就算其中一個有參數、一個沒參數,結果還是一樣,javascript 不管參數的
※以上只發生在用「var」關鍵字宣告時
※同名2
<script type="text/javascript"> function test(){ alert('main test'); } </script> <script type="text/javascript" src="extTest.js"></script>
※載入另外一個檔案也是會覆蓋,如最後一行如果有test function,會以另外一個檔案為主,但如果將它寫在第一個script的上面,那又變成main test為主
※不支援javascript一
window.onload = function(){ <!-- aaa(); //--> };
※「//」是javascript單行註解;「/* */」是javascript多行註解
「<!-- -->」是HTML的多行註解
如果不支援javascript,那就會報錯,針對不支援的可以用HTML的註解包起來
※但如果javascript和HTML都有支援,那用HTML註解包起來也不會執行,所以用上面的寫法,分開多行,將最後的「-->」用javascript註解(兩種都可以)包起來可以執行的到
而不支援的看不種「//」,所以就會很順利的註解了
※不支援javascript二
<script> // ... </script> <noscript> <h1> not support!</h1> </noscript>
※和<script>同層,裡面寫HTML就可以了
※設定瀏覽器禁用javascript
這裡只介紹IE和ChromeIE:
工具-->網際網路選項-->安全性,然後看圖操作我沒重新啟動時,畫面如上,按「允許被封鎖的內容」還是可以;重啟後,就沒有提示了
Chrome:
如果下圖沒看到,要按「顯示進階設定」
沒有留言:
張貼留言