需求
創(chuàng)造執(zhí)行上下文,是為了把變量聲明給保存下來,在執(zhí)行時,好找到變量用
一見如故
- 看代碼要分執(zhí)行前(構建執(zhí)行上下文)和執(zhí)行時去看
- 執(zhí)行上下文的組成
1、詞法環(huán)境:[全局對象]、scope、outer
2、This Binding:提供this的訪問 - 構建執(zhí)行上下文
1、處理聲明
2、檢查重復定義
3、初步賦值
全局執(zhí)行上下文
全局對象為window或者global
outer為null
This Binding指向window文章來源:http://www.zghlxwxcb.cn/news/detail-431775.html
構建全局執(zhí)行上下文
1、處理聲明
①找到全局中的var聲明、頂級的全局函數聲明(不在大括號內、不在函數中,以function開頭的),并記錄全局對象中
②找到頂級的let、const、class,記錄到全局scope中,并記錄這些標識符的位置,在此之前不允許賦值
2、檢查重復定義
檢查全局scope中的變量名在全局對象及全局scope中有沒有重復出現,重復出現會報錯
3、初步賦值(在代碼執(zhí)行時,訪問一個沒有被賦值的變量會報錯)
①先給var申明的變量賦值為undefined
②再給函數標識符賦值一個函數對象,其中屬性包含:
prototype、name(函數名)、length(形參長度)、arguments、[[scope]]
函數對象的隱式屬性scope指向棧頂執(zhí)行上下文
函數執(zhí)行上下文
- '函數對象’是在函數聲明時產生的,函數對象有個隱式的[[scope]]屬性,指向當前棧頂的執(zhí)行上下文
- '函數的執(zhí)行上下文’包含scope、outer、this binding,是在函數執(zhí)行的前一刻生成的。并直接壓入執(zhí)行上下文棧頂,函數執(zhí)行結束,彈出棧頂
- 如果在當前執(zhí)行上下文的scope中找不到變量,就沿著outer找,outer指向函數對象的[[scope]]
for循環(huán)中的執(zhí)行上下文
// 使用let的話,小括號和大括號都會生成各自的執(zhí)行上下文
// 當前執(zhí)行上下文中找不著,就沿著鏈找,就會找到小括號中的i
for(let i; i< 5;i++){
setTimeout(function(){
console.log(i)
},0)
}
// 0,1,2,3,4
// 使用var的話,var聲明的變量在全局對象中
for(var i; i< 5; i++){
setTimeout(function(){
console.log(i)
},0)
}
// 5,5,5,5,5
函數中的this
一、指向函數執(zhí)行上下文的this binding,默認是window,但是改變
1、隱式綁定this(對象’.'的方式)
2、顯示綁定this(call、apply)
二、在開發(fā)中this為什么難:
在框架中函數多出現以回調的模式,所以它去怎么綁定this的,我們并不知道
三、箭頭函數的執(zhí)行上下文沒有this binding,所以沒法綁定this,沒法new,它會去找其作用域鏈中的this文章來源地址http://www.zghlxwxcb.cn/news/detail-431775.html
到了這里,關于js執(zhí)行上下文的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!