函数的作用域以及预编译
生活随笔
收集整理的這篇文章主要介紹了
函数的作用域以及预编译
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、函數的作用域
- 函數作用域有點像單面鏡(外面看不到里面,里面可以看到外面)
- JS的特點:單線程、是 解釋性語言 (翻譯一行,執行一行)
二、預解析
JS預解析三部曲:語法解析 ? 預編譯 ? 解釋執行
JS 在執行之前會通篇掃描代碼,看有沒有語法語義錯誤(語法解析),如果沒有,然后開始執行代碼(預編譯)
- 通篇掃描 --> 語法分析
- 通篇掃描之后開始執行 --> 預解析
三、變量和函數的提升
預編譯四部曲
預編譯練習 – 提升的意思就是被優先執行了
function fn(a) {console.log(a); // function a() {}var a = 123;console.log(a); // 123function a() {}console.log(a); // 123var b = function () {}console.log(b); // function() {}function d() {} }// 預編譯發生在函數執行的前一刻 fn(1);/*1. 創建AO對象 (Activation Object) 2. 用形參和變量聲明的名,作為AO對象的屬性名,值統一為 undfiendAO {a : undefined,b : undefined}3. 把形參和實參的值統一AO {a : 1,b : undefined}4. 在函數體里面找函數聲明,賦予函數體AO {a : function a() {}, // 只有函數聲明會提升,函數表達式不會提升b : undefined,d : function d() {}}5. 函數執行AO {a : 123,b : function() {},d : function d() {}} */在全局下會生成一個GO對象(Global Object)
function test() {var a = b = 123;console.log(a);console.log(window.b); // 123console.log(window.a); // undefined } test();/*GO: {b: 123;}AO: {a: undefined} */函數聲明整體提升 變量聲明提升
a = 100; function demo(e) {function e() {}arguments[0] = 2;console.log(e); // 2if (a) { // a 是 undefined 所以這里 if 不會執行var b = 123;function c() {// 豬都能做出來}}var c;a = 10;var a;console.log(b); // undefinedf = 123;console.log(c); // undefinedconsole.log(a); // 10 } var a; demo(1); console.log(a); // 100 console.log(f); // 123/*GO {a: 100f: 123function demo() {}}AO {c: undefineda: 10e: 2} */總結
以上是生活随笔為你收集整理的函数的作用域以及预编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle内存表与临时表,Oracle
- 下一篇: ST_Curve --- 一个专业的曲线