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