js---07 js解析器範圍

來源:互聯網
上載者:User

標籤: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解析器範圍

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.