2016年4月21日 星期四

注意事項 (JavaScript 1)

※任意地點的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和Chrome

IE:

工具-->網際網路選項-->安全性,然後看圖操作




我沒重新啟動時,畫面如上,按「允許被封鎖的內容」還是可以;重啟後,就沒有提示了


Chrome:


如果下圖沒看到,要按「顯示進階設定」


沒有留言:

張貼留言