范围链在 JavaScript 一堆奇奇怪怪的观念中算是简单好懂的,简单来说就是:
『函示内没有对应的变数、常数或是函示时,他会往外层寻找』
这边一样用程序码来说明。
function playGame(){
const gaming = 'PS5'
console.log(`我要用 ${gaming} 玩游戏`)
}
playGame() //我要用 PS5 玩游戏
上面这段 gaming
在函示内,因此能正确显示,这段好像废话,不过接下来我们试者把 gaming
移到外层全域看看结果如何:
const gaming = 'PS5'
function playGame(){
console.log(`我要用 ${gaming} 玩游戏`)
}
playGame() //我要用 PS5 玩游戏
结果是一样的,上面 playGame()
函式中因为本身没有 gaming
常数,因此他会到外层也是全域 (window) ,来获得 gaming
常数的资料。
接下来便是在函示内外都新增两个 gaming
来看看结果如何
const gaming = 'PS5'
function playGame(){
const gaming = 'Switch'
console.log(`我要用 ${gaming} 玩游戏`)
}
playGame() //我要用 Switch 玩游戏
所以结果就是当函示内有相关资料时,变不会往外层寻找,而是直接使用函示内资料。
(因为 const
、 let
提升的状况不一样,这边范例先改为使用 var
, const
、 let
会到介绍他们的章节再来提及)
JavaScript 实际编译并执行程序码时,会分为两种阶段:
等创造阶段执行完毕,才会进入执行阶段,创造阶段有几个重点:
而执行阶段的重点则是:
XX()
。这边使用上面程序码,并稍微调一下顺序就可验证上面提到的创造阶段。
console.log(gaming) // undefined
var gaming = 'PS5'
playGame() //我要用 PS5 玩游戏
function playGame(){
console.log(`我要用 ${gaming} 玩游戏`)
}
console.log(gaming)
这段会因为变数被提升,但尚未赋值因此是 cosnole 会回传 undefined
playGame()
则是 function playGame()
函示会因为提升效果,而先比被呼叫函示的 playGame()
建立,因此 console 可以正确显示。
因为提升这个 特性 会让上面的程序码,在编译顺序变为:
// 创造阶段
//函示优先提升
function playGame(){
console.log(`我要用 ${gaming} 玩游戏`)
}
var gaming
// 执行阶段
console.log(gaming) // undefined
gaming = 'PS5'
playGame() //我要用 PS5 玩游戏
最後要说的是,Hoisting 只是概念,只是帮助我们理解,程序码在编译时会这麽做,但他仍只是一种概念, 这点 MDN 文件也有说明到:
提升(Hoisting)是在 ECMAScript® 2015 Language Specification 里面找不到的专有名词。它是一种厘清 JaveScript 在执行阶段内文如何运行的思路(尤其是在创建和执行阶段)。
>>: D1 (9/1)-全家(5903),统一超(2912)
前言 今天将从前篇介绍的模组做延伸,继续稍微深入研究模组的一些眉眉角角。 在我们前篇有提到一个重点,...
开新地图了!之前花了 12 天把【如何衡量万事万物】读完,最後几天的摘要比较简略(汗) 接下来是【S...
Cursor and Zoom-in 今天继续增加图表功能,其中两个很常需要的功能就是游标和区域放...
前言:介绍完了二元树的建立和走访方式,紧接着要来介绍其他基本应用,一样用上一篇的程序码进行修改 可以...
平台就是你的资本和机会,在这数位时代,你不定义自己,别人会自动为你贴标签。 这是来自数位形象力这本书...