多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[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'定义的'函数表达式'当做'块级函数',只能在'块级函数'下面使用, 不可以在'代码块外'使用,无论是'严格模式'还是'非严格模式'下,在'代码块外'使用'块级函数'都会报错 ~~~