作用域
静态作用域与动态作用域
https://en.wikipedia.org/wiki/Free_variables_and_bound_variables
https://en.wikipedia.org/wiki/Scope_(computer_science)
所谓的词法作用域其实是指作用域在词法解析阶段既确定了,不会改变。我们要知道js是遵循静态作用域的。举个例子:var foo=1;
作用域链
<高设>中的标识符解析过程
词法作用域的函数中遇到既不是形参也不是函数内部定义的局部变量的变量时,去函数定义时的环境中查询。动态域的函数中遇到既不是形参也不是函数内部定义的局部变量的变量时,到函数调用时的环境中查。
var foo=1;
function static(){
alert(foo);
}
!function(){
var foo=2;
static();
}();
var _map={};
var _svg;
function mapRender(){
_map.render=function(callback){
if(!_svg){
var _svg = d3.select("#d3MapWrap") //var导致报错
.append("svg")
.attr("id","d3MapSVG")
.attr("width",600)
.attr("height",470)
.attr("text-align","left");
}
return _map;
}
<!DOCTYPE html>
<html>
<head>
<title>先找当前作用域,后找上一级作用域,一层层网上找</title>
</head>
<body>
<script type="text/javascript">
var a=0;
function test(){
alert(a);
debugger;
if(false){
var a;//a在当前作用域已经声明了,作用域已经确定了。test执行会现在本作用域中找a没有才会找上一层。
}
}
test()
</script>
</body>
</html>