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. 預編譯

  1. 檢查通篇的語法錯誤
  2. 預編譯的語法錯誤
  3. 解釋一行,執行一行
  • 函數聲明,函數整體提升
  • 變量聲明,只有聲明提升,賦值不提升
    在這里插入圖片描述

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

一、 函數內部

變量優先

  1. 創建AO對象:尋找函數里的形參變量聲明提升,添加到AO(活躍對象/函數上下文 activation object)里
  2. 把實參的值賦值給形參
  3. 尋找函數聲明,添加到AO
  4. 執行函數(按函數語句走)// 執行時,對于前幾步處理過的變量聲明、函數聲明將跳過
  5. 對于變量重復聲明,紅寶書的例子(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
}

二、全局

  1. 在通篇js執行前,創建GO(global object)全局上下文(即window)
  2. 尋找變量聲明
  3. 尋找函數聲明
  4. 執行(不要忘記賦值、注意執行順序)
  • 函數表達式顯然是報錯,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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251206.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251206.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251206.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

javascript --- 優先級執行順序

優先級網址 優先級: a && b || c ? c || b ? a : c && b :a// 從優先級網址可以看出 // &&的優先級為:6 // ||的優先級為:5 // ...?...:...的優先級為:4 所以上面的執行順序為(括號的優先級最高為20): ((a && b) || c) ? (c || b) ?…

CodeForces 1009B(思路)

本來打算打打cf找找自信的&#xff0c;結果&#xff0c;死在了一個2000多人都做出來的B上&#xff0c;寫了170多行wr在t4&#xff0c;大佬十幾行代碼就過了&#xff0c;難受啊。 #include <iostream> #include <cstring> #include <algorithm> #include <…

Delphi及C++Builder經典圖書一覽表(持續更新中2018.01.02)

序號書名原版書名作者譯者出版社頁數年代定價備注1CBuilder 5程序設計大全CBuilder 5 Developer’s GuideJarrod Hollingworth康向東、汪浩、黃金才等機械工業出版社13932002.1138.00元2CBuilder應用開發大全Borland C Builder 3 UnleashedCharlie Calvert,et al.徐科、馮焱、呂…

javascript --- 非交互、交互、協作、任務

非交互: var res {};function foo(results) {res.foo results; }function bar(results) {res.bar results; }ajax( "http://some.url.1", foo); ajax( "http://some.url.2", bar);// foo和bar彼此不相關,誰先執行都無所謂..不影響執行結果交互: // 交…

ES5-6 作用域、作用域鏈、預編譯、閉包基礎

1. 作用域 上一級在執行時&#xff0c;內部函數被定義&#xff0c;內部函數便生成作用域和作用域鏈&#xff08;拿上一級的環境&#xff09;&#xff0c;內部函數執行前生成自己的AO&#xff0c;并排在頭部函數執行結束時&#xff0c;AO被銷毀&#xff08;回到被定義時的狀態&…

electron 項目的搭建方式,借助 node 和 npm

1&#xff0c;首先確定安裝了 node 和 npm 2&#xff0c;創建一個文件夾&#xff0c;如 aa 3&#xff0c;CMD 命令進入到 aa&#xff0c;用 npm 命令初始化一個項目 4&#xff0c; npm -init 根據提示完成配置 5&#xff0c;安裝 electron > npm i -D electronlatest, 這一…

zbb20171215 git 版本回退

1. 使用git log命令查看所有的歷史版本&#xff0c;獲取某個歷史版本的id&#xff0c;假設查到歷史版本的id是139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96。 2. git reset --hard 139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96 3. 把修改推到遠程服務器 git push -f -u origin ma…

ES5-7 立即執行函數、閉包深入、逗號運算符

1. 立即執行函數 定義在全局的函數只有關閉瀏覽器或者退出程序才會釋放IIFE: Immediately-Invoked Function Expression解決頁面加載自動執行&#xff0c;執行完成后立即釋放&#xff08;避免了只會執行一次的內容一直存在于全局&#xff09;IIFE用匿名函數或者函數聲明&#…

es6 --- 解構賦值的簡潔性

設想你有一個工具foo,它可以異步產生兩個值(x和y): function getY(x) {return new Promise( function(resolve, reject) {setTimeout( function() {resolve( (3*x) -1 );}, 100);}); }function foo(bar, baz) {var x bar * baz;return getY(x).then( function(y){return [x, …

redis安裝(linux)

一、redis安裝步驟 1、yum install gcc 如果你機器已經安裝了編譯環境請忽略&#xff0c;否則在使用make編譯源碼時會報錯。 報錯信息&#xff1a;make: *** [adlist.o] 2、使用wget命令下載包  wget http://download.redis.io/releases/redis-4.0.6.tar.gz 3、解壓tar包 tar…

驗證碼何時可以退出歷史舞臺?

驗證碼是有必要存在的&#xff0c;只是不同階段表現形式不同&#xff0c;未來的趨勢是更加智能無感知&#xff0c;用戶體驗更好。 簡而言之&#xff0c; 驗證碼其終極目的&#xff0c;就是區分正常人和機器的操作。區分人機行為是必要的&#xff1a;互聯網上各種行為&#xff0…

ES5-8 閉包高級、對象、構造函數、實例化

1. 對象 對象內定義的函數一般稱之為方法&#xff0c;在外部的函數聲明稱為函數對象刪除屬性使用delete 關鍵字 var obj {a: 1,b: string } console.log(obj, obj) // {a: 1, b: "string"} delete obj.b console.log(obj, obj) // {a: 1}在對象里&#xff0c;this…

es6 --- 使用生成器交替執行

考慮以下場景: var a 1; var b 2;function foo(){a;b b * a;a b 3; }function bar(){b--;a 8 b;b a * 2; }foo(); bar(); console.log(a, b); // 11 22bar(); foo(); console.log(a, b); // 183 180對于上面的兩個函數foo和bar,它們中的任何一個,一旦開始了就會…

oracle-group by -having

1、GROUP BY 語句用于結合合計函數&#xff0c;根據一個或多個列對結果集進行分組。(也就是說group by 和聚合函數結合起來使用&#xff0c;要查詢的結果來沒有聚合函數則報錯&#xff1a;不是group by 表達式) a、where 不能放在group by 后面使用 b、having 要和group by 連在…

【轉載】匯編速查手冊

一、數據傳輸指令 ─────────────────────────────────────── 它們在存貯器和寄存器、寄存器和輸入輸出端口之間傳送數據. 1. 通用數據傳送指令. MOV 傳送字或字節. MOVSX 先符號擴展,再傳送. MOVZX 先零擴展,再傳送. PUSH 把字壓…

ES5-9 【utils】構造函數及實例化原理、包裝類

1. 構造函數 調用構造函數實際會經歷4步 1 創建一個新對象 2 將構造函數的作用域賦值給對象&#xff08;因此this就指向了這個對象&#xff09; 3 執行構造函數中的代碼&#xff08;為這個新對象添加屬性&#xff09; 4 返回新對象 在構造函數內部&#xff0c;this指向構造函數…

es6 --- 異步迭代生成器 Promise

看一個經典ajax回調的例子: function foo(x, y, cb) {ajax("http://some.url.1/?x" x "&y" y,cb); }foo(11, 31, function(err, text) {if(err) {console.error(err);}else {console.log(text);} });// 異步請求some.url.1參數為x 11, y31的數據.…

Mysql5.7.20使用group by查詢(select *)時出現錯誤--修改sql mode

使用select * from 表 group by 字段 時報錯錯誤信息說明&#xff1a; 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column haha_db.staff.id which is not    functionally dependent on columns in GROUP BY clause; this…

【心情隨筆】03

一、 越是學習越是感到自己的無知。以往總有不求甚解的做法&#xff0c;稍微看了一下就囫圇吞棗算懂了&#xff0c;其實這是逃避&#xff0c;不僅面試問的時候答不上來&#xff0c;而且內部可以用來擴展的思想也沒有領悟到。連該問題都說不清楚更不要說舉一反三了。近來&#x…

ES5-10 原型、原型鏈、閉包立即執行函數、插件開發

重學第六章 1. 原型 實例內屬性和原型上屬性重名時&#xff08;屏蔽&#xff09; function Test(name) {this.name name } Test.prototype.name hhh let tObj new Test(yyy) console.log(tObj.name) // yyy tObj.name null console.log(tObj.name) // null delete tObj.…