本文實(shí)例為大家深度剖析JS的作用域,代碼注釋詳細(xì),供大家參考,具體內(nèi)容如下
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>作用域問題</title></head><body><script> /* * 1.全局變量與局部變量 * 外層變量可以在內(nèi)層調(diào)用(全局),內(nèi)層變量不能在外層調(diào)用(局部) * */ var a = 1; (function () { // 外部變量可以在內(nèi)部調(diào)用 alert(a); })(); /*function test() { // 內(nèi)部變量不能在外部調(diào)用 var a = 2; } alert(a); // 報(bào)錯(cuò)*/ /* * 下面舉個(gè)例子: * 函數(shù)調(diào)用只是回到函數(shù)定義的地方,調(diào)用一下函數(shù) * 這里在bbb函數(shù)中,調(diào)用aaa函數(shù), * 這時(shí)的aaa函數(shù)并不是被放入bbb函數(shù)中,而是在原定義的地方 * 這是的aaa中沒有變量a,所以去訪問全局變量中的a * */ /*var a = 10; function aaa() { alert(a); } function bbb() { var a = 20; aaa(); } bbb(); // 10*/ /* * 2.當(dāng)var不加的時(shí)候,會(huì)自動(dòng)變成全局變量 * 在全局環(huán)境中,不加var和加var效果一樣,都是全局變量 * 在局域環(huán)境中,加var會(huì)被定義為局部變量,不加var會(huì)被定義為全局變量 * */ /*function test() { var a = 10; // 外部訪問不到 b = 10; // 相當(dāng)于全局變量 // 上面相當(dāng)于:var a = b = 10; } test(); alert(b); // 10 alert(a); // 報(bào)錯(cuò)*/ /* * 3.變量查找按照就近原則去查找 * var定義的變量,當(dāng)就近查找沒有找到就去外層查找 * */ /*var a = 10; (function() { var a = 20; // a在匿名函數(shù)中var定義了,所以找到為20 alert(a); // 20 })();*/ /*var a = 10; (function() { a = 20; // 相當(dāng)于全局變量,將外部的var a = 20; // 在匿名函數(shù)中沒有找到var定義的a,然后去外層去查找 // 外部查找到了,var a = 10 = 20; alert(a); // 20 })();*/ /*var a = 10; (function() { // 在匿名函數(shù)中沒有找到var定義的a,然后去外層去查找 // 外部查找到了,var a = 10 alert(a); // 10 a = 20; })();*/ /*var a = 10; (function() { // 在匿名函數(shù)中找到var定義的a, // 這里的var a = 20,存在變量提升, // 在執(zhí)行alert(a)之前,變量提示有var a; // 但是a沒有值,所有返回undefined alert(a); // undefined var a = 20; // 在變量提升的情況下,相當(dāng)于下面: // var a; // alert(a); // a = 20; })(;*/ /*var a = 10; (function() { // 執(zhí)行bbb,bbb中的a=20,但是與匿名函數(shù)和全局變量a無關(guān) bbb(); // 在匿名函數(shù)中查找var定義的a,發(fā)現(xiàn)沒有 // 繼續(xù)在外層中查找,發(fā)現(xiàn)了 var a = 10; alert(a); // 10 function bbb() { var a = 20; } })();*/ /* var a = 10; (function() { bbb(); // 在匿名函數(shù)中查找var定義的a,發(fā)現(xiàn)沒有 // 繼續(xù)在外層中查找,發(fā)現(xiàn)了 var a = 10 = 20; alert(a); // 20 function bbb() { // 沒有var定義,所有為全局變量,外面的全局變量 var a = 10 = 20; a = 20; } })();*/ /* * 當(dāng)參數(shù)與局部變量重名時(shí),優(yōu)先級(jí)等同 * */ /*var a = 10; (function (a) { // 這里的參數(shù)a是基本類型,按值傳參的 // 相當(dāng)于在匿名函數(shù)內(nèi)部重新定義了一個(gè)a, // 且與外層的a不相關(guān) a += 3; })(a); alert(a); // 10*/ /*var a = [1,2,3]; (function (a) { // 這里的參數(shù)a是特殊類型,按引用傳參的 // 相當(dāng)于在匿名函數(shù)內(nèi)部重新定義了一個(gè)a, // 但是這個(gè)a是外層a的一個(gè)別名,它們引用了同一個(gè)地址 // 所以內(nèi)部a添加值,外部a可以訪問到 a.push(4); })(a); alert(a); // [1,2,3,4]*/ /*var a = [1,2,3]; (function (a) { // 這里的參數(shù)a是特殊類型,按引用傳參的 // 相當(dāng)于在匿名函數(shù)內(nèi)部重新定義了一個(gè)a, // 但是這個(gè)a是外層a的一個(gè)別名,它們引用了同一個(gè)地址 // 所以內(nèi)部a添加值,外部a可以訪問到 // 但是,這里的a又重新賦值了新的數(shù)組,斷開了與外層的關(guān)系 a = [1,2,3,4]; })(a); alert(a); // [1,2,3]*/</script></body></html>以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注