这篇文章我们来探讨 Javascript 的语法作用域
function callName () { var husky = '哈士奇'; console.log(husky);}callName();
如果是上述的例子,很明显会印出 哈士奇 的文字,到这边应该没有问题。
但如果今天把 console.log 移到外面的话~
function callName () { var husky = '哈士奇';}callName();console.log(husky);
印出来的就会是~
那是因为 Javascript 是使用 静态作用域 的语言
那甚么是静态作用域呢?
所以这样我们就知道 静态作用域 是在 语法解析的时候,就已经确定了。
另外的动态作用域,则是在函式 被调用呼叫的时候 才决定的。如下图:
而静态作用域的话,在写法上,会是一种层层包覆的概念,最外面定义的变数就叫做 全域变数 。
而在全域中定义的 function , 又在那个 function 中定义的变数,就叫做 区域变数 。
如果在 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。
以上就是关于作用域的解说,汪汪~