[TOC]
>[success] # 塊級函數
~~~
什么是'塊級函數'? 答: 就是在一個代碼塊(if{ })中寫函數,例如:
~~~
~~~
if(true){
function heheda(){ // 塊級函數
}
}
~~~
<br/>
>[success] ## 塊級函數的變量提升
~~~
大家都知道'var'會存在'變量提升','塊級函數'也存在'變量提升'
~~~
非嚴格模式下:
~~~
console.log(doSomething) // undefined
if (true) {
doSomething() // 1
function doSomething() {
console.log(1)
}
doSomething() // 1
}
doSomething() // 1
~~~
嚴格模式下:
~~~
"use strict"
console.log(doSomething) // 報錯: doSomething is not defined
if (true) {
doSomething() // 1
function doSomething() {
console.log(1)
}
doSomething() // 1
}
doSomething() // 報錯: doSomething is not defined
~~~
var定義的函數表達式情況下:
~~~
"use strict"
console.log(a) // undefined
if(true){
console.log(a) // undefined
var a = function(){
console.log(1)
}
a() //1
}
a() // 1
~~~
<br/>
>[success] ### 總結
~~~
1.在'非嚴格模式'下,代碼塊(if{})上可以打印出'undefined',代碼塊下可以執行代碼塊中的'塊級函數',
在'代碼塊'中'塊級函數'的上下都可以調用'塊級函數'
2. 在'嚴格模式'下只有在代碼塊中(if{})'塊級函數'上下可以調用'塊級函數',在代碼塊外調用'塊級函數'會報錯
3.用'var'定義的'函數表達式'充當'塊級函數'使用,無論是'嚴格模式'還是'非嚴格模式',都會存在'變量提升'
~~~
<br/>
>[success] ## let定義的塊級函數
~~~
在代碼塊(if{})中,使用'let'定義的'函數表達式'是'沒有變量提升'的
~~~
嚴格模式下:
~~~
"use strict"
console.log(doSomething) // doSomething is not defined
if (true) {
doSomething() // 報錯
let doSomething = function(){
console.log(1)
}
doSomething() // 1
}
console.log(doSomething) // doSomething is not defined
~~~
非嚴格模式下:
~~~
console.log(doSomething) // doSomething is not defined
if (true) {
doSomething() // 報錯
let doSomething = function(){
console.log(1)
}
doSomething() // 1
}
console.log(doSomething) // doSomething is not defined
~~~
<br/>
>[success] ### 總結
~~~
1. 代碼塊(if{})中如果使用的是'let'定義的'函數表達式'當做'塊級函數',只能在'塊級函數'下面使用,
不可以在'代碼塊外'使用,無論是'嚴格模式'還是'非嚴格模式'下,在'代碼塊外'使用'塊級函數'都會報錯
~~~
- Javascript基礎篇
- Array數組
- 數組插入值
- filter()
- forEach()
- push()
- pop()
- unshift()
- shift()
- valueOf()
- 面向對象思想
- Javascript 面向對象編程(一):封裝
- Javascript面向對象編程(二):構造函數的繼承
- Javascript面向對象編程(三):非構造函數的繼承
- 解構
- 數組的解構賦值
- 對象的解構賦值
- 函數參數解構
- 字符串的解構賦值
- 數值和布爾值的解構賦值
- 圓括號問題
- 字符串.
- split()
- charAt()
- charCodeAt()
- concat()
- indexOf()
- lastIndexOf()
- match()
- replace()
- includes()
- 初識遞歸
- 渲染ul-li樹形結構
- 異步函數解決方案
- 1. callback回調函數
- 2. ES6 - Promise
- JavaScript高級程序設計(書)
- 在html中使用JavaScript
- script標簽的位置
- 延遲腳本
- 異步腳本
- <noscript>元素
- 基本概念
- 嚴格模式
- 變量詳解
- 數據類型
- typeof操作符
- undefined類型
- Null類型
- Boolean類型
- Number類型
- 深入了解ES6(書)
- var 、let 、 const
- 字符串與正則表達式
- 字符串
- 正則表達式
- 函數
- 函數形參默認值
- 使用不具名參數
- 函數構造器的增強能力
- 擴展運算符
- name屬性
- 明確函數的多重用途
- 塊級函數
- 箭頭函數
- 尾調用優化
- 擴展的對象功能
- 對象類別
- 對象字面量語法的擴展
- ES6對象新增方法
- 重復的對象屬性
- 自有屬性的枚舉順序
- 更強大的原型
- 解構:更方便的數據訪問
- 為什么要用解構?
- 對象解構
- 數組解構
- 混合解構
- 參數解構
- Symbol與Symbol屬性
- 創建Symbol
- Symbol的使用方法
- Symbol全局私有屬性
- Symbol與類型強制轉換
- Symbol屬性檢索
- Symbol的一些構造方法
- Set集合與Map集合
- Set集合
- Weak Set集合(弱引用Set集合)
- Map集合
- JS標準內置對象
- Object 構造函數及屬性
- Object 構造方法
- Symbol 內建對象類的函數及屬性
- Set 構造函數及屬性
- Weak Set 構造函數及屬性
- JS雜項
- 類數組對象
- Class類的理解和使用