javascript函数做用域链之词法做用域

在开发语言中常见的做用域规则有  块级做用域和词法做用域函数

做用域 顾名思义就是起做用的区域  定义一变量后 ,能够在此范围做用的区域spa

1、块级做用域就是用一个块结构分割变量的访问区域  块即{ } 表明语言有C 系列语言code

2、词法做用域就是变量的做用范围,简言之词法做用域与代码的编写有关于执行无关,函数内部容许访问函数外部的变量对象

特色:分割做用域只有函数blog

变量名提高ip

函数名提高作用域

函数的声明比变量的声明优先级高开发

function a(){     
}  
var a;  
alert(a);//打印出a的函数体  
  
var a;  
function a(){     
}  
alert(a);//打印出a的函数体  

//可是要注意区分和下面两个写法的区别:   
var a=1;  
function a(){     
}  
alert(a);//打印出1  
  
<script>  
function a(){     
}   
var a=1;  
alert(a);//打印出1  
    function test() {  
    
    bar(); // 2  
    var foo = function () { // 变量指向函数表达式  
        console.log("1");  
    }  
    function bar() { // 函数声明 函数名为bar  
        console.log("2");  
    } 
    foo();//1
}  
test(); 

可是
    function test() {  
    foo();//报错
    bar();   
    var foo = function () { // 变量指向函数表达式  
        console.log("1");  
    }  
    function bar() { // 函数声明 函数名为bar  
        console.log("2");  
    } 
   
}  
test(); 

 结论
一、声明会提高 io

二、 只有函数才会限定做用域
绘制做用域链规则
    1> 将所有的 script 标签看作一个总体. 是一个 0 级别的链
    链中全部的全局范围内的变量, 函数, 对象... 都是链中的成员
   因为声明会提高, 所以在绘制链以前将代码能够进行调整, 在开始的时候
    将声明都写在前面, 绘图的时候按照顺序绘制, 较为简单.
   
   2> 因为只有函数才能够限定做用域. 所以在函数上引出一条新链, 级别为 n + 1
   在函数内部, 又是一个完整, 独立的做用域结构
   所以在函数内部定义的任何成员也按照 1> 中的规则在该链上展开

 3> 若是有函数, 继续绘制下去console

 变量搜索原则 在代码的运行过程当中, 若是访问某一个变量 那么首先在当前链上找 ( 无序 ), 若是没有, 在 n-1 级上找 ( 在函数内部容许访问定义在函数外部的变量 ) 如此往复, 直到 0 级链, 若是尚未 抛出异常 若是找到, 则结束寻找, 直接得到该链上变量的数据

相关文章
相关标签/搜索