1. 程式人生 > 實用技巧 >Pytorch斷開後繼續訓練

Pytorch斷開後繼續訓練

作用域的一些概念

任何宣告在某個作用域內的變數,都將附屬於這個作用域。

提升

先看兩個例子
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上卷——提升