1、什麼是執行上下文?
分析乙個問題之前,首先我們都需要知道它是什麼。執行上下文又稱詞法環境,它是儲存和處理資料的棧,主要分為兩部分:
2、變數名、函式名衝突問題
如果多個人寫js**,衝突問題是很難避免的,所以我們需要知道什麼時候會發生衝突問題,然後改怎麼解決。
1)產生衝突問題的情況
①預處理過程:如果兩個函式名相同,後面的會覆蓋前面的,即使裡面的引數個數不同,也會進行覆蓋。
console.log(fun1);
fun1();
function
fun1
() function
fun1
(val)
這裡會輸出」aaa」而不是「執行fun1函式」。
②執行階段:
③優先順序:宣告的函式》用var定義的變數;因此,當函式先宣告,變數後宣告,名字相同但是變數不會將函式進行覆蓋,而是將它忽略。
3、案例分析
一旦**執行,就會產生乙個全域性上下文,函式只有被呼叫的時候才會產生上下文。綜上可知,在預處理階段,全域性上下文中會有三個變數,分別為a=undefined fun1(){} fun2=undefined;當執行第一行**的時候,因為在全域性上下文中a還沒有被賦值,所以輸出undefined;而全域性上下文中並沒有b,所以這裡輸出b程式會報錯;同理,fun1就是輸出它的函式體;fun2=undefined;
當執行到fun1()時,由於fun1在全域性上下文中有函式體,所以可以正常輸出;而fun2()在全域性上下文中仍是undefined,所以這個時候被呼叫時會報錯的。
案例2;
總共產生了三個上下文,預處理階段如圖所示,由於在fun()中b發生了衝突,由於宣告的函式比變數的優先順序要高,所以b(){}會將變數b進行覆蓋;當執行fun(1,2)這行**時,a的值會變為1,而執行階段不會再處理宣告方式定義的函式,因此b的輸出仍然函式b(){}。
之前學其他語言的時候,也都聽說過作用域這個概念,簡單來說就是可以使用的範圍。與其他語言不通的是,js中的作用域沒有塊級域之說,不會以{}來進行作用域的分離。
for(var i=0;i<5;i++)
console.log(i,str);
//這裡雖然是在for迴圈裡面定義的變數,但是在js中在全域性仍可以訪問的到
js中的作用域主要分為部分:全域性作用域和本地作用域。
作用域和上下文的區別:作用域是在**寫完後作用域就已經確定好了,而上下文會因為**的執行而發生改變。
作用域和執行上下文
當全域性 開始執行前,先建立全域性執行上下文環境 2.當全域性執行上下文環境建立好了以後將上下文中的所有內容放入棧記憶體 3.最先放入的在最下邊 global 4.其他執行的函式的執行上下文依次放入 放入的順序是 的執行順序 5.棧中最後放入的執行完最先出棧。6.1.除全域性作用域之外,每個函式都會...
執行上下文和作用域
執行上下文 1.分類 位置 全域性 函式 區域性 2.全域性執行上下文 在執行全域性 前將window確定為全域性執行上下文 對全域性資料進行預處理 var定義的全域性變數 undefined,新增為window的屬性 function宣告的全域性函式 賦值 fun 新增為window的方法 thi...
作用域和上下文
作用域分為全域性作用域和區域性作用域。區域性作用域中可訪問全域性變數,但是全域性作用域中無法訪問某一區域性作用域中的區域性變數。上下文常常代表this變數的值及其指向,它決定乙個函式怎麼被呼叫,但乙個函式被作為物件的乙個方法被呼叫的時候,this總是指向呼叫這個方法的物件。this往往指向當前函式的...