1. 程式人生 > >js作用域相關知識總結

js作用域相關知識總結

沒有 全局對象 不能 get 變量 OS 是什麽 今天 原因

以前總是搞不清楚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(typeof
num2); //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作用域相關知識總結