前言:這是筆者學習之后自己的理解與整理。如果有錯誤或者疑問的地方,請大家指正,我會持續更新!
作用域、作用域鏈、執行環境、執行環境棧以及this的概念在javascript中非常重要,本人經常弄混淆,這里梳理一下;
局部作用域函數內部的區域,全局作用域就是window; 作用域鏈取決于函數被聲明時的位置,解析標識符的時候就先找當前作用域,再向外查找,直到全局,這樣一個順序;和函數在哪里調用無關; 執行環境就是函數可訪問的數據和變量的集合,也就是函數的作用域鏈上的所有數據和變量; 執行環境棧就是根據代碼執行順序,各執行環境按照棧的形式逐層訪問,并且用完了退出來扔掉;如果當前執行環境(存放當前作用域鏈里的數據和變量)找不到變量,那就是找不到了,不會往之前的那個執行環境查找,它和作用域鏈是不同的; this是一個對象,它取決于是誰執行的,誰執行那就是誰;(this的概念還是不太清楚,這里寫的有點萬金油,過兩天再來修正)作用域
JavaScript沒有塊級作用域的概念,只有函數級作用域:變量在聲明它們的函數體及其子函數內是可見的。
作用域就是變量和函數的可訪問范圍,控制著變量和函數的可見性與生命周期,在JavaScript中變量的作用域有全局作用域和局部作用域。
變量沒有在函數內聲明或者聲明的時候沒有帶var就是全局變量,擁有全局作用域;
<script type="text/javascript"> function test1(){ a = 1;//全局變量,只有在當前函數運行時,才有效 } test1(); console.log(a);//1 注意test1函數必須運行,不然找不到a </script>全局變量可以當做window對象的屬性用,他們是一樣的;
<script type="text/javascript"> var b = 1;//全局變量 console.log(b === window.b);//true 全局變量可以當做window對象的屬性用,他們是一樣的;</script>
window對象的所有屬性擁有全局作用域,在代碼任何地方都可以訪問;
函數內部聲明的變量就是局部變量,只能在函數體內使用,函數的參數雖然沒有使用var但仍然是局部變量。
<script type="text/javascript"> var c = 1;//全局變量// console.log(d);//ReferenceError: d is not defined 引用錯誤,當前作用域就是最外層作用域,依然找不到d function test2(d){ console.log(c);//1 全局變量,哪都可以訪問;(先找當前作用域,找不到,就向外層作用域找,直到window最外層,找到了) console.log(d);//3 形參是局部變量,只有當前作用域下可以訪問 } test2(3); </script>作用域鏈
作用域鏈取決于函數被聲明時的位置,解析標識符的時候就先從當前作用域開始找,在當前作用域中無法找到時,引擎就會在外層嵌套的作用域中繼續查找,直到找到該變量,或抵達最外層的作用域(也就是全局作用域)為止;它的路線已經被定死了,和函數在哪里運行無關;
新聞熱點
疑難解答
圖片精選