能講一下其中的原理不,為啥報錯,不能重名?

uj5u.com熱心網友回復:
終于明白了:關于宣告提前~用運算式也就是帶=的宣告會分成兩個步驟,先是把名字提到最頂端,然后賦值在原地,但是function c()這種函式宣告就只有一步,宣告和賦值同時進行,所以,var c=1的賦值會在函式賦值之后,所以最后c不是一個函式,而是1uj5u.com熱心網友回復:
終于明白了:關于宣告提前~用運算式也就是帶=的宣告會分成兩個步驟,先是把名字提到最頂端,然后賦值在原地,但是function c()這種函式宣告就只有一步,宣告和賦值都會提前同時進行,所以,var c=1的賦值會在函式賦值之后,所以最后c不是一個函式,而是1
uj5u.com熱心網友回復:
JS中的函式名就是變數名。所以函式c和變數c是同一個。
uj5u.com熱心網友回復:
這個我知道,因為JS是弱型別語言,我問的是變數宣告提升的問題
uj5u.com熱心網友回復:
預定義,在代碼沒有執行前會將參考型別的資料預覽地址存盤在堆疊中,資料存盤在堆中;變數為值型別存盤在堆疊中;代碼從上往下執行,先預覽了變數,再預覽函式方法,在呼叫方法后無法判斷是變數還是還是就報錯了uj5u.com熱心網友回復:
預定義,在代碼沒有執行前會將參考型別的資料預覽地址存盤在堆疊中,資料存盤在堆中;變數為值型別存盤在堆疊中;代碼從上往下執行,先預覽了變數,再預覽函式方法,在呼叫方法后無法判斷是變數還是還是就報錯了uj5u.com熱心網友回復:
堆疊,剛開始老師是這么講的但后來才發現,原來老師最早是Java工程師,所以用堆和堆疊的概念,后來一個專業的web前端講師說,JavaScript里面根本沒有堆和堆疊,只有Windows和Windows之外,和Java的堆和堆疊概念類似,不過我提的這個問題現在已經明白了,謝謝你的大篇解答
uj5u.com熱心網友回復:
https://gitee.com/hflxhn/summary/blob/master/web/javascript/1%20-%20%E9%A2%84%E7%BC%96%E8%AF%91/2%20-%20%E9%A2%84%E7%BC%96%E8%AF%91%E6%A6%82%E5%BF%B5.html
你可以看看這個,js的預編譯程序
// 1. 創建AO物件 Activation Object (執行期背景關系)
// 2. 找行參和變數宣告, 將變數和行參名作為AO屬性名, 值為undefined
// 3. 將實參指和行參統一
// 4. 在函式體里面找函式宣告,值賦予函式體
//
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);
// 預編譯發生在函式執行的前一刻
//
// AO{
// a : functiona () {}
// b : undefined
// d : function() {}
// }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/96903.html
標籤:JavaScript
上一篇:jqGrid 樹表格加載本地資料
