Pytorch斷開後繼續訓練
阿新 • • 發佈:2020-11-21
作用域的一些概念
任何宣告在某個作用域內的變數,都將附屬於這個作用域。
提升
先看兩個例子
eg1
a = 2;
var a;
console.log( a ); //2
eg2
console.log(a);
var a=2; //undefined
對於eg2 js會將其看成兩部分,var a ,a=2;所以eg2會變為
var a;
console.log(a);
a=2;
原因
引擎在解釋js程式碼之前首先對其進行編譯。編譯階段的一部分工作就是找到所有的宣告,並用合適的作用域將它們關聯起來。
只有宣告本身會被提升,而賦值或其他執行邏輯會留在原地。
- 函式宣告會被提升,但是函式表示式不會被提升
foo();
var foo=function bar(){
//...
};
這段中變數識別符號foo()先被提升並分配給所在作用域,但是foo並沒有被賦值,此時foo()是undefined,此時對undefined值進行操作而導致非法操作,丟擲TypeError異常。
var foo;
foo();
foo=function bar(){};
- 即使是具名函式表示式,名稱識別符號在賦值之前也無法在所在作用域中使用;
foo();//TypeError;
bar();//ReferenceError;
var foo=function bar(){
//...
};
經過變數提升的形式:
var foo; foo(); bar(); foo=function(){ var bar=...self... //... };
- 函式優先
函式宣告和變數宣告都會被提升,在多個重複宣告的程式碼中,函式首先被提升,然後是變數;
且後面的可以覆蓋前面的;
foo();//3
function foo(){
console.log(1);
}
var foo=function(){
console.log(2);
};
function foo(){
console.log(3);
}
總結
預編譯:函式宣告整體提升,變數宣告提升(賦值不提升)。
幾個概念:
1.暗示全域性變數(implyglobal):變數未經宣告就賦值,此變數屬於全域性變數。
2.一切宣告的變數,都是全域性的屬性
作用域做題四部曲:
1.建立AO物件(作用域、執行器上下文)
2.找形參和變數宣告,將其作為AO物件的屬性名,值為undefined
3.形參和實參相統一
4.在函式體裡找函式宣告,將值賦予函式體。
(var b=function(){}叫函式表示式 不在考慮裡)預編譯出現在函式宣告的前一刻
題:
function fn(a){
console.log(a);
var a = 123;
console.log(a);
function a(){}
console.log(a);
var b= function(){}
console.log(b);
function d(){}
}
fn(1);
//function a(){}
//123
//123
//function (){}
步驟三:
AO{
a:function a(){},
b:undefined,
d:function d(){}
}
再按照順序執行。
參考:你不知道的JaveScript上卷——提升