js作用域相關知識總結
以前總是搞不清楚js裏面的作用域、塊級作用域、預解析,做題總做錯,今天徹底搞明白了,來記錄梳理一下~
塊級作用域
在其他語言中,任何一對花括號中的語句都屬於一個塊兒,在這之中定義的所有變量在代碼塊外都是不可見的。Js中沒有塊級作用域
一個感覺在面試中會經常遇到的問題
for(var i =0;i<10;i++){ var num = 100; } console.log(i); //i是多少
第一反應是i是9,但是錯了,i是10。因為按照循環條件,i肯定是在0-10之間,當i=9的時候,都還在執行循環體,然後9++到10,不符合循環條件,跳出循環,所以此時i是10
變量的使用範圍
1.局部變量
因為js裏面沒有塊級作用域,當一個變量聲明在函數的內部,此時這個變量叫做局部變量,它不能在函數外部被訪問到
function f1(){ var num = 1000; } f1(); console.log(num);
2.全局變量
直接在script標簽中定義的變量,或者說是不在函數中定義的變量都叫做全局變量
var num = 1000; </script> <script> function f1(){ console.log(num); } f1(); </script>
3.隱式全局變量
隱式全局變量:當一個變量聲明的時候,沒有使用var,那麽這個變量就是隱式全局變量
註意!
通過var創建的全局變量是不可被刪除的,而隱式全局變量是可以被刪除的。這表明在技術上,隱式全局變量並不是真的全局變量,它們是全局對象的屬性,屬性是可以通過delete刪除的,而變量不能。
var num = 1000; num2 = 200; delete num; delete num2; console.log(typeof num); //number 這裏即使用delete刪除了num,它的類型還是number 無法真正被刪除 console.log(typeofnum2); //undefined 而隱式全局變量很容易被刪除了
變量退出作用域後會被銷毀,全局變量關閉網頁或瀏覽器之後才會被銷毀/釋放
function f1(){ var num = 10; } f1();
這個函數被調用以後,變量所占的空間就被釋放了——因為這個函數被用完了
**回調函數粗略的講解
回調函數:函數作為另一個函數的參數使用
function getSum(x,y){ return x + y; } function ff(x,y,fn){ //fn作為一個參數 return fn(x,y); //fn是一個函數,並且被調用了 } var result = ff(1,5,getSum); //給fn傳參 console.log(result)
函數還可以作為另一個函數的返回值調用
function f1(){ return function (){ console.log(123); } } var result = f1(); //函數賦值給result //console.log(result) 錯誤寫法 這樣只會打印出來f1的函數體 result();
little Trick
function aa(){ alert(‘aaaa‘); return function (){ alert(‘bbbb‘); } } alert(aa); alert(aa()); alert(aa()());這三個結果分別是什麽?
結果1 函數名打印出來是整個函數體
結果2 彈出aaaa和返回值內的匿名函數,原因是,函數被調用後內部執行了這段代碼,然後匿名函數並未被調用,所以返回的是整段匿名函數體
結果3 彈出aaaa,bbbb,和undefined 匿名函數也被調用了,所以彈出了bbbb 為什麽會再彈一次undefined呢~?
arguments對象
arguments是一個對象,一個偽數組,可以獲取函數參數的個數
**偽數組的概念:可以使用.length,但是不可以調用數組的方法。
function f1(){ var sum = 0; for(var i =0;i<arguments.length;i++){ sum += arguments[i]; //arguments是一個偽數組。它可以指代函數的參數 } return sum; } var result = f1(10,22,11,33,155); console.log(f1);
js作用域相關知識總結