[js]声明与作用域

作用域

静态作用域与动态作用域

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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容