標籤:reference 解析 嵌套 www .com class 函數 全域 bsp
<script> /* js是函數級範圍,在函數內部的變數,內部都能訪問, 外部不能訪問內部的,但是內部可以訪問外部的變數 閉包就是拿到本不該屬於他的東西,閉包會造成記憶體流失,你不知道什麼時候會用這個閉包,然後這個資源會一直佔據記憶體,造成記憶體流失 */ /*1 --函數內部可以訪問外部的變數*/ /*var i = 10; function test() { console.log(i); } test();*/ /*2 在函數外部,我們就不能訪問函數內部的變數,不然會報變數沒有被定義*/ /*function test() { var j = 20; } console.log(j);*/ //test.html:19 Uncaught ReferenceError: j is not defined /*3 函數的嵌套--這個a函數就能訪問test函數的j變數*/ /*function test() { var j = 5; function a() { console.log(j); } a(); } test();*/ //5 /*4*/ /* function test() { if(false) { var i = 5; } else { j = 10; } //i--undefined 是沒有被賦值而已 j--10 //test.html:42 Uncaught ReferenceError: k is not defined 這就是沒有定義--報錯 console.log(i+"-->"+j +"-->"+k); } test();*/ /*5 -- 這裡 在執行的過程中,會將test()這個函數前置,但是在調用它的時候卻不會找到j,因為j是在後面定義的*/ /*test(); //undefined var j = 10 function test() { console.log(j); }*/ /*6*/ /*test(); //返回 undefined var k = 200; function test() { console.log(k); }*/ /*7*/ /* var k; test(); //undefined k = 200; function test() { console.log(k); } */ /*其執行個體子6和7是一個意思,都是變數定義了,但是沒被賦值,執行test()的時候,都返回undefined*/ /*9面試題:函數前面加一個波浪線*/ /*var j = 100; ~(function() { console.log(j); })(); //返回100 */ /*10 函數前面沒有波浪線的情況*/ /*var k = 5; (function() { console.log(j); })();*/ //返回 --》test.html:89 Uncaught ReferenceError: j is not defined //函數前面加波浪線,此時會將函數轉化為一個運算式 輸出 所以這個波浪線很重要 /*11面試題:*/ /*var i = 10; function test() { console.log(i); var i; } test(); */ // 返回undefined 這裡的後面的var i;這條語句會被前置,然後會將外面的全域變數i給覆蓋掉,此時這裡面的i又沒有被賦值,所以,執行test()會返回undefined; 下面12的例子說明這個問題 /*12*/ /*var j = 20; function test() { var j; console.log(j); j = 5; } test(); *///返回undefined 和11是一樣的,這裡在函數內部定義了j 直接把外部的j給覆蓋掉了,然後賦值操作又在console語句的後面,所以會出現undefined /*---------------------------分割線----------------------*/
/*13 --這裡就是閉包 將我們函數裡面的內容用函數的方式返回出去*/ /*function test() { var j = 5; return function() { return j; } } var t = test()(); console.log(t);*/ </script>
深入理解Js的執行過程很重要
這裡有,js如何解析函數的
js變數範圍和閉包的樣本