標籤:tag length btn inpu 文檔 http 按鈕 blog 函數調用
js解析器首先不會逐行讀代碼,這是第二部了。首先 根據var找到變數,根據function找函數,找到變數var a = 1,js解析器只會讀取等號前面的var a,並把a設定值未定義,並不會讀取等號後面的a = 1,所以a的值是未定義,並加入倉庫,根據function找到函數後,function a (){ alert(2); },找到函數是函數整體,這是js的預解析(預解析只找var 和函數)。遇到重名的留下後面的,變數和函數重名了,函數在後面,只留下函數。正式讀取代碼的時候,是從上到下從左至右,上面<script/>塊中定義的變數可以直接在下面的<script/>中使用。alert(a);var a = 1;讀取到alert(a);時候,因為之前a是未定義,所以這個報錯,遇到運算式a = 1,就把之前a是未定義變成1。var a = 1;function fn1(){ alert(a); var a = 2;}fn1();alert(a);首先預解析找到var a = 1,此時a未定義,和函數,加入倉庫(預解析只解析var 和 函數的定義)。預解析完了,從上到下執行,遇到函數調用fn1(); 函數是一個局部的域,會新開一個局部範圍,遇到域就進行預解析和逐行執行代碼,局部預解析時var a 是未定義,局部預解析完了就開始逐行執行代碼,alert(a)只會在函數局部域內找a是未定義,var a = 2隻是改變局部域中a為2不會改變全域域的a,最後alert(a)彈出1var a = 1;function fn1(){ alert(a); a = 2;}fn1();alert(a);首先預解析,a是未定義,函數fn1也加入倉庫,全域域的預解析完了。下面開始逐行執行代碼。var a = 1把倉庫中的a改成1,找到函數的定義,這裡不動它,然後找到函數的調用fn1(),開始函數局部域的預解析,局部域中沒有var 和函數定義,局部域的預解析完了,然後逐行執行函數內部,讀到alert(a),在局部域中沒有找到a,則會向上級域中去找,找到全域域的a = 1,彈出a = 1,在執行a = 2,局部範圍沒有a則找到上級域,把a改成了2,最後彈出2.var a = 1;function fn1(a){ alert(a); //a是局部域中的倉庫中的a, a = 2;}fn1();alert(a);首先預解析var a = 未定義 ,和函數fn1()加入倉庫。逐行執行代碼a = 1,函數調用fn1(),看到參數a,會在函數局部範圍解析a = 未定義,alert(a)彈出未定義,a= 2改變局部範圍中的a的值,最後alert(a),彈出1。var a = 1;function fn1(a){ alert(a);//a是局部域中的倉庫中的a, a = 2;}fn1(a);alert(a);全部預解析,a=未定義,函數就是一個函數。讀代碼,全域a=1,函數定義不動。函數調用,局部開始新的預解析和逐行讀代碼,局部沒有var 沒有function,有參數a,加入局部域的倉庫a = 未定義,接下來局部域逐行讀代碼,首先從參數開始讀,a= 1,是從全域前面傳進來的,局部範圍的a等於1了,alert(a)彈出1,a=2修改局部範圍的a = 2,全域a沒有改變,因為a參數傳進來相當於局部域定義了一個新變數a,最後彈出1function fn2(){ var a = ‘9999999克拉鑽石23456789‘; fn3(a);}fn2();function fn3(a){ alert(a);}全域解析:把函數fn2()和fn3()加入全域的倉庫。逐行讀代碼: fn2()調用: 局部解析 var a = 未定義,無函數定義 局部逐行讀代碼,a = ‘9999999克拉鑽石23456789‘,函數調用fn3(a),局部域倉庫中沒有找到fn3()的定義,去全域域中找,找到了,fn3(a)調用開始: 局部的局部解析,參數相當於新定義一個局部變數,a = 未定義 局部的局部逐行執行代碼,a = 全域傳進來的值9999999克拉鑽石23456789,alert(a)
<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>無標題文檔</title><script>window.onload = function (){ var aBtn = document.getElementsByTagName(‘input‘); for( var i=0; i<aBtn.length; i++ ){ aBtn[i].onclick = function (){ alert( i ); // 一直是3,因為for執行完之後i一直等於3 //aBtn[i].style.background = ‘yellow‘; for( var i=0; i<aBtn.length; i++ ){ aBtn[i].style.background = ‘yellow‘; } }; }};</script></head><body><input type="button" value="按鈕1" /><input type="button" value="按鈕2" /><input type="button" value="按鈕3" /></body></html>
js---07 js解析器範圍