作用域就是程序源代碼定義變量的區(qū)域,規(guī)定如何去查找變量兔魂,作用域?qū)ψ兞康脑L問(wèn)權(quán)。
在 js 中詞法作用域規(guī)則:
1.函數(shù)允許訪問(wèn)函數(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饰躲,但是沒(méi)有操作牙咏,接著執(zhí)行foo函數(shù),console查找變量嘹裂,如果沒(méi)有就向上一級(jí)查找妄壶,也就是value=1,所以會(huì)打印1寄狼,bar函數(shù)內(nèi)的局部變量沒(mé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語(yǔ)句前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í)依然有效壤蚜。
感謝