#前言javascript
聲明部分:
包涵:
聲明的內部函數,變量,參數,維護一個地址池,地址池裏面的地址指向內部函數,變量和參數。
本質:就是函數對象的屬性
執行部分:
包涵:
除了聲明之外的計算過程都包含在這個裏面
本質:就是函數對象的一個方法
參數部分
在調動函數部分時動態賦值
java
引擎發現下面這個函數聲明編程
function funOut(arg,arg1){
var prop = 0;
function funInner(){
console.log(porp1);
}
var props = 1;
funInner();
console.log(arg,arg1);
}
複製代碼
整體經歷瞭如下幾步windows
1建立scope對象並建立地址池
var funOut = {
arg:null,
arg1:null,
prop:null,
prop1:null,
funInner:null,
_props_:window,
init:function(supperContext,arg,arg1){
funOut. _props_ = supperContext||windows
funOut.arg = arg,
funOut.arg1=arg1,
funInner = function(funOut,arg,arg1){
funOut.arg = arg,
funOut.arg1=arg1
},
},
applay:function(){
prop = 0;
porp1 = 1;
funInner();
console.log(arg,arg1);
},
this:windows//由於funOut對用戶不可見,this只是一個特殊的處理而已
}
注:上面這個結構是引擎經過引擎內置語言實現的,對用戶不可見,有多是C也有多是彙編這個不是重點
複製代碼
其實到如今變量提高緣由已經很明顯了,函數對象不是js對象遵循其餘編程語言規範
function cir(){
cir()
}
function cor(){
setTimeOut(function(){
cor
},2000);
return true;//cor函數執行到此處已經完結,彈出棧因此cor的深度是固定的
}
注意兩則的本質區別
複製代碼
以上東西不少爲我的臆測。若是有指導更正感激涕零!bash