函数作用域和块级作用域

------------>函数作用域:

        顾名思意也就是在创建函数的时候附加的一个作用域    

function foo(){
   var b=2;  
}
console.log(b);//ReferenceError

 

         从上面的代码我们就可以确认在创建函数foo()的时候,我们创建了一个函数作用域,因为在外面找不到这个变量!!!

------------>嵌套的函数作用域

        依旧是一个作用域中套着一个作用域

function foo(a){
 
    function dar(){
        console.log(b);//13
    }
    var b=10;   
dar();
} foo(3);

        这个例子也说明了作用域是一层一层向上遍历标识符的

------------>函数表达式/函数声明

        我们来看一下他们的定义

           函数声明:function是声明中的第一个词

           函数表达式:function不是什么中的第一个词

        我们来看一下例子

var d=function(){}//函数表达式
function foo(){}//函数声明

------------>块级作用域{}

        首先我们来看一个"寻常的例子"

for(var i=0;i<10;i++){
console.log(i);
}
console.log(i);//10

          在这里我们可以看到变量已经被泄露到了全局作用域中

        那我们这么样可以避免这样的污染?!看下面的例子

for(let i=0;i<10;i++){
console.log(i);
}
console.log(i);//ReferenceError

          在这里我们使用了一个关键字let,作用是让变量绑定到这个作用域,上面的代码同下

{
  let i;  
  for(i=0;i<10;i++){
        let j=i;
       console.log(j);        
    }  
}    

      当然还可以这样

{    
    for(var i=0;i<10;i++){
        console.log(i);
    }
}
console.log(i);//ReferenceError

      还可以这样

 

(function foo(){
   for(var i=0;i<10;i++){
       console.log(i);  
    }      
})();//在后面加了一个括号,表示立即执行这个函数表达式

 

--------------->const

 

                     这个关键字就是标明这个标识符是常量的意思

 

 const b=function foo(a){
    console.log(a);
 };
    b(33);
    (b=function(d){console.log(d);})(44);//TypeError

 

        这个也说明了const可以放在任何地方

 

posted @ 2017-03-28 10:12  夏风微凉  阅读(284)  评论(0)    收藏  举报