作用域就是程序源代碼定義變量的區(qū)域,規(guī)定如何去查找變量,作用域?qū)ψ兞康脑L問權(quán)。
在 js 中詞法作用域規(guī)則:
1.函數(shù)允許訪問函數(shù)外的數(shù)據(jù).
2.整個代碼結(jié)構(gòu)中只有函數(shù)可以限定作用域.
3.作用規(guī)則首先使用提升規(guī)則分析
4.如果當(dāng)前作用規(guī)則中有名字了, 就不考慮外面的名字
因為 JavaScript 采用的是詞法作用域,函數(shù)的作用域在函數(shù)定義的時候就決定了。
例子:
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar(); //1
瀏覽器執(zhí)行bar函數(shù),里面定義了局部變量value=2,但是沒有操作,接著執(zhí)行foo函數(shù),console查找變量,如果沒有就向上一級查找,也就是value=1,所以會打印1,bar函數(shù)內(nèi)的局部變量沒有被使用到,這個就是js的靜態(tài)作用域(詞法作用域)
再看一個例子《javascript權(quán)威指南》
var scope= "global scope";
function checkscope(){
var scope="local scope";
function f(){
return scope;
}
return f();
}
checkscope();
不論你在哪個return語句前console.log(scope)都會打印 local scope,原因也很簡單,因為JavaScript采用的是詞法作用域,函數(shù)的作用域基于函數(shù)創(chuàng)建的位置。
而引用《JavaScript權(quán)威指南》的回答就是:JavaScript 函數(shù)的執(zhí)行用到了作用域鏈,這個作用域鏈?zhǔn)窃诤瘮?shù)定義的時候創(chuàng)建的。嵌套的函數(shù) f() 定義在這個作用域鏈里,其中的變量 scope 一定是局部變量,不管何時何地執(zhí)行函數(shù) f(),這種綁定在執(zhí)行 f() 時依然有效。
感謝