一、基礎雜記 1. document.write() 1 <script type="text/javascript"> 2 document.write('<h2>我愛你</h2>'); 3 </script> 2. 變數必須聲明才能使用: 使用var聲明:局部變數; 沒有使用var聲明:全局變數 ...
一、基礎雜記
1. document.write()
1 <script type="text/javascript"> 2 document.write('<h2>我愛你</h2>'); 3 </script>document.write
2. 變數必須聲明才能使用:
使用var聲明:局部變數;
沒有使用var聲明:全局變數;
3. 數據類型:
String:字元串 ‘’ ,“”;
Number:數字;
Boolean:布爾型;
Undefined:未定義,只是聲明瞭變數,但沒有賦值;
Null:空;
Object:對象(數組,函數等);
4. prompt:
1 var num=prompt("請輸入:");//彈出輸入對話框,並將輸入值傳遞給num; 2 alert(num);prompt
二、函數:
1. 引用傳遞實例:
1 //按引用傳遞的對象函數實例: 2 var p1=new Object(); 3 function display(obj){ 4 obj.name='lisi'; 5 } 6 p1.name='zhangsan'; 7 display(p1); 8 alert(p1.name);//結果:'lisi'引用傳遞
2. 匿名函數:
1)函數名就是首地址;
1 <script type="text/javascript"> 2 //匿名函數 3 var i=0; 4 function display(){ 5 alert('hello!'); 6 } 7 i=display();//變數i的值為函數的返回值,且立刻執行display這個函數,'()'有立刻執行的作用; 8 i=display;//變數i指向了這個函數的首地址; 9 i(); 10 </script>
2)匿名函數演變:
1 var j=function display1(){//此時的display名稱已經沒有意義; 2 alert('nihao!'); 3 } 4 j(); 5 var k=function(){ 6 alert('nihao!'); 7 }; 8 k();
3)自調用匿名函數:
1 <script type="text/javascript"> 2 //沒有任何變數指向這個函數的首地址; 3 //用()將函數括起來,相當於得到函數的收地址,後面的()相當於立即執行這個函數; 4 //自調用匿名函數也可以傳遞參數 5 (function(index){ 6 alert('hello,js:'+index); 7 })(10); 8 9 </script> 10 //結果:10;
這種寫法的好處:可以避免代碼庫中的函數重命名的問題,並且以上代碼只會在運行時執行一次,一般用作初始化工作;
3. 全局變數和局部變數:
在函數內部定義(用var定義,如果沒有用var定義,也是全局的變數)的變數是局部變數,否則是全局變數;
1 <script type="text/javascript"> 2 var i=1;//全局 3 j=2;//全局 4 function play(){ 5 var k=3;//局部 6 p=4;//全局 7 } 8 play(); 9 alert(p);//結果:4 10 </script>
為什麼沒有var定義的變數就是全局的呢?
是因為,在js中,如果某個變數沒有var聲明,會自動到上一層作用域中區找這個變數的聲明語句,如果找到,就使用,如果沒有找到,繼續向上查找,一直查找到全局作用域為止,如果全局作用域中仍然沒有這個變數的 聲明語句,那麼會自動在全局作用域進行聲明,這個就是js中的作用域鏈;
4. 作用域鏈:內部作用域訪問外部作用域;(外部作用域訪問內部作用域:閉包)
1 <script type="text/javascript"> 2 var i=1; 3 function fn1(){ 4 var i=10; 5 function fn2(){ 6 i=100; 7 function fn3(){ 8 i=1000; 9 } 10 fn3(); 11 } 12 fn2(); 13 } 14 fn1(); 15 alert(i);//結果:1 16 </script>
5. arugments的使用:
在一個函數內部,可以使用arguments屬性,它表示函數的形參列表,它是以數組形式體現的;
如果定義時,參數個數不確定,可以通過arguments這個屬性來保存所有實參;
1 <script type="text/javascript"> 2 function display(){ 3 //沒有定義形參,那麼所有形參會自動存放到arguments這個屬性數組中; 4 for(var i=0;i<arguments.length;i++){ 5 document.write(arguments[i]+','); 6 } 7 8 } 9 display('lisi','zhangsan','wangwu');//結果:'lisi','zhangsan','wangwu' 10 </script>
五、js的執行過程
js中的script是分段執行的;
執行過程:
1)讀取第一個代碼段
2)編譯:
聲明變數,聲明函數,語法檢查,語義檢查,代碼優化...
var i=10;
var i;
3)執行
4)讀取第二個代碼段
5)編譯
6)執行
.........
結束
1 <script type="text/javascript"> 2 //錯誤:i is not defined 3 alert(i); 4 </script> 5 <script type="text/javascript"> 6 //彈出:undefined 7 //原因:首先編譯,這是已經聲明瞭變數j,這時它是undefined,接下來是執行alert,此時,j還沒有賦值,所以... 8 alert(j); 9 var j=10; 10 //彈出:10 11 //原因:此時j應經賦值; 12 alert(j); 13 </script>
六、js中的常見錯誤:
編譯錯誤和運行錯誤。
1. 兩種錯誤導致的結果:相同點
(錯誤後面的js語句都不會有效果)
1 <script type="text/javascript"> 2 alert(n); 3 alert("hello"); 4 </script> 5 <script type="text/javascript"> 6 var n=10; 7 alert(n; 8 alert("hello"); 9 </script>
2.不同點:
運行錯誤代碼段會彈出"hello1",因為執行完第2行,執行第3行時出錯;
編譯錯誤代碼段不會彈出"hello2",因為編譯過程就已經出錯,就不會執行改代碼段了;
1 <script type="text/javascript"> 2 alert("hello1"); 3 alert(m);//運行錯誤 4 </script> 5 <script type="text/javascript"> 6 alert("hello2"); 7 var n=10; 8 alert(n;//編譯錯誤 9 </script>
總結:
編譯時,如果發生錯誤,那麼當前代碼段會停止執行,而執行後面代碼段的內容;
運行時,如果發生錯誤,但前面的代碼已經執行完畢,所以不會影響前面的內容;
無論是哪種錯誤,不會影響後面的代碼段的執行;
1 <script type="text/javascript"> 2 alert(i);//運行錯誤 3 var first=10; 4 function play(){ 5 alert("play"); 6 } 7 </script> 8 <script type="text/javascript"> 9 alert(first); 10 play(); 11 </script>
結果:彈出undefined,彈出play;
1 <script type="text/javascript"> 2 var first=10; 3 function play(){ 4 alert("play"); 5 } 6 alert(i; //編譯錯誤 7 8 </script> 9 <script type="text/javascript"> 10 alert(first); 11 play(); 12 </script>
結果:什麼也沒彈出;
總結:如果代碼段中出現編譯錯誤,那麼該代碼段中所有已經聲明的全部無效;
JS執行流程圖: