JavaScript靜態(tài)作用域解析

靜態(tài)作用域與動態(tài)作用域

因為 JavaScript 采用的是詞法作用域,函數(shù)的作用域在函數(shù)定義的時候就決定了。
而與詞法作用域相對的是動態(tài)作用域,函數(shù)的作用域是在函數(shù)調(diào)用的時候才決定的。
學(xué)過編譯原理的同學(xué)應(yīng)該知道這兩者的區(qū)別

看下列的區(qū)別

var value = 1;
function print(){
  console.log(value);
}
function foo(){
  var value = 2;
  print();
}
foo();//1
var value = 1;
function foo(){
  var value = 2;
  function print(){
    console.log(value); 
 }
  print();
}
foo();//2

這就是js的靜態(tài)作用域所造成的區(qū)別,假設(shè)js是動態(tài)作用域的話,那么兩個例子輸出就應(yīng)該都是2啦
在《JavaScript權(quán)威指南》中有如下的例子,我們可以看下,順便鞏固對js靜態(tài)作用域的理解

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope()();

兩段代碼都會打印:local scope。
原因也很簡單,因為JavaScript采用的是詞法作用域,函數(shù)的作用域基于函數(shù)創(chuàng)建的位置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容