Javascript 进阶 2-3 语法作用域(Lexical scope)

这篇文章我们来探讨 Javascript 的语法作用域

function callName () {    var husky = '哈士奇';    console.log(husky);}callName();

如果是上述的例子,很明显会印出 哈士奇 的文字,到这边应该没有问题。

但如果今天把 console.log 移到外面的话~

function callName () {    var husky = '哈士奇';}callName();console.log(husky);

印出来的就会是~

http://img2.58codes.com/2024/20121770C81Xaa0Ye4.png

那是因为 Javascript 是使用 静态作用域 的语言

那甚么是静态作用域呢?

http://img2.58codes.com/2024/20121770x94TNq0z0s.png

所以这样我们就知道 静态作用域 是在 语法解析的时候,就已经确定了。

另外的动态作用域,则是在函式 被调用呼叫的时候 才决定的。如下图:

http://img2.58codes.com/2024/20121770k5E3S7ZfBu.png

而静态作用域的话,在写法上,会是一种层层包覆的概念,最外面定义的变数就叫做 全域变数 。

而在全域中定义的 function , 又在那个 function 中定义的变数,就叫做 区域变数 。

http://img2.58codes.com/2024/20121770KXo1S7yLHP.png

如果在 function 要调用的变数 function 内部没有宣告区域变数的话,就会 向外查找

如果一直向外到最外层的全域都还找不到的话,就会报错。

好~这样我大概知道有静态作用域,是在一开始语法解析的时候就确定了

另外还有动态作用域,是在函式被调用的时候决定作用域。

但,向外查找的判断是根据甚么来判断的呢?

就用下面的例子来讲解 静态作用域 跟 动态作用域 的差别好了

var value = 1;function fn1 () {    console.log(value);}function fn2 () {    var value = 2;    fn1();}fn2();

以这样的例子来说,静态作用域(Javascript): => 最后 fn1 印出来的 value 会是 数字 1,因为 fn1 被呼叫的时候,内部没有定义 value 的变数,所以就向外查找 到全域,就找到了 value 是被定义为 数字 1。

但是如果是以动态作用域的方式来解读的话,就会是依照 function 被呼叫的地方进行判断

也就是说 fn1 被呼叫的地方是在 fn2 里面,而在被呼叫之前, value 已经被改赋值成 数字 2 ,所以最后的答案就会是数字2。

以上就是关于作用域的解说,汪汪~


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章