日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ES5-5 参数默认值、递归、预编译、暗示全局变量

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ES5-5 参数默认值、递归、预编译、暗示全局变量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 參數默認值

  • 默認是undefined
  • 形參可以有默認值,形參、實參哪個有值取哪個ES6,默認值屬于ES6的內容,打印出的是符合人性化的結果
  • 形參有默認值,形參、實參無法統一、無論實參傳入有值還是undefined(代碼表現)
function test(a = 1, b) {console.log(a, b)console.log(arguments[0]) // undefined } test(undefined, 1) // 1 1 function test(a = 1, b) {console.log(a, b)// 1 1console.log(arguments[0]) // undefineda = 8console.log(a) // 8console.log(arguments[0]) // undefined } test(undefined, 1) function test(a, b) {console.log(a, b)// 2 1console.log(arguments[0]) // 2a = 8console.log(a) // 8console.log(arguments[0]) // 8 } test(2, 1) function test(a, b) {a = 3;console.log(a) // 3console.log(arguments[0]) // 3 } test(1, 2) function test(a = undefined, b) {console.log(a, b) } test(1, 1) // 1 1 // 用es5的寫法設置默認值 function test(a, b) {a = arguments[0] || 1console.log(a, b) // 1 1 } test(undefined, 1) // typeof的方式 function test(a, b) {a = typeof (arguments[0]) === 'undefined'? 1: arguments[0]console.log(a, b) } test(undefined, 1) // 1 1

2. 預編譯

  • 檢查通篇的語法錯誤
  • 預編譯的語法錯誤
  • 解釋一行,執行一行
    • 函數聲明,函數整體提升
    • 變量聲明,只有聲明提升,賦值不提升

    預編譯的流程(函數執行前的步驟)

    一、 函數內部

    變量優先

  • 創建AO對象:尋找函數里的形參和變量聲明提升,添加到AO(活躍對象/函數上下文 activation object)里
  • 把實參的值賦值給形參
  • 尋找函數聲明,添加到AO
  • 執行函數(按函數語句走)// 執行時,對于前幾步處理過的變量聲明、函數聲明將跳過
  • 對于變量重復聲明,紅寶書的例子(js從來不會告訴你是否多次聲明了同一個變量,遇到這種情況,它只會對后續的聲明視而不見),不過它執行后續聲明中的變量初始化
    =注意-==
  • function countFn(count) {for (var i = 0; i < count; i++) {console.log(i) // 0 1 2 3 4}var i // 重復 視而不見console.log(i) // 5 } countFn(5) function test(a) { // 預編譯第一步,將形參添加到AO時var avar aconsole.log(a) // 1 } test(1) // 打印 // f a(){} // 1 // 1 // f (){} function test(a) {console.log(a) // fn avar a = 1;console.log(a) // 1function a() { }console.log(a) // 1var b = function () { }console.log(b) // fn function d() { } } test(2) function test(a, b) {console.log(a) // 1c = 0console.log(c) // 0var ca = 5console.log(a) // 5console.log(b) // f b(){}b = 6console.log(b) // 6function b() { }console.log(d) // f d(){}function d() { }console.log(b) // 6console.log(d) // f d(){} } test(1) AO = {a:undefined → 15,b:undefined → f b → 6,c:undefined → 0,d: f d }

    二、全局

  • 在通篇js執行前,創建GO(global object)全局上下文(即window)
  • 尋找變量聲明
  • 尋找函數聲明
  • 執行(不要忘記賦值、注意執行順序)
    • 函數表達式顯然是報錯,GO里test是變量undefined
    test() var test = function () { } function test2(){} GO = {test:undefined → f test(){}test2: f test2(){} } // 打印 // f a(){} // undefiendGO = {b:undefineda:fa }


    console.log(b) // undefined var b = 3; console.log(b) // 3 console.log(a) // f a(a) function a(a) {console.log(a) // f a()a() // undefined 5var a = 2;console.log(a) // 2function a() {console.log(b)var b = 5;console.log(b)} } a(1) GO = {b:undefineda:fa(a) } AO = {a:undefined → 1fa()2b:undefined → }

    • 不要混淆:AO內有a,不會再去查找GO里的a
    • 預編譯不管if語句的,只要有變量聲明就要放入AO
    • js中無塊級作用域,即使用{}括起來,b也是聲明在函數test內部的局部變量,會被添加到執行環境
    • 使用var聲明的變量會被自動添加到最接近的環境中
    function test() {return a;a = 1;function a() {};var a = 2 } console.log(test()) // f a(){}AO = {a:undefined → fa } function test() {a = 1;function a() { };var a = 2return a } console.log(test()) // 2 function test(e) {function e() { }console.log(e); // f e(){}arguments[0] = 2;console.log(e); // 2if (a) {var b = 3}var c;console.log(a); // undefineda = 4;var a;console.log(b); // undefinedf = 5;console.log(c); // undefinedconsole.log(a); // 4 } var a test(1) console.log(f); // 5GO = {a: undefined test: f test(e){...},f: 5 // 在執行test內函數值 } // 執行test(1)時創建AO AO = {e:undefined → 1 → f e(){}2 b: undefined → c: undefined → a: undefined → 4 }

    暗示全局變量

    • 未用var 聲明的b就是暗示全局變量,是window的屬性之一
    function test() {var a = b = 1 // 1. var a // 2. b = 1 (賦值,沒有在function內部聲明,是全局變量,存到window) // 3. a = b (賦值) }


    練習

    var a = false + 1; console.log(a) // 1 隱式類型轉換 var b = false == 1; console.log(b) // false

    注意運算符優先級&&低于+
    運算符優先級

    if (typeof (a) && (-true) + (+undefined) + '') {console.log('通過了') // 通過了} else {console.log('沒通過') }

    if (1 + 5 * '3' === 16) {console.log('通過了') // 通過了 } else {console.log('沒通過') }

    console.log(!!" " + !!'' - !!false || '沒通過') // 1

    總結

    以上是生活随笔為你收集整理的ES5-5 参数默认值、递归、预编译、暗示全局变量的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。