js变量的作用域

浏览器对js文件的解析机制

function fn(){};
fn();
console.log(i);
var i=10;
var k=20;
console.log(k);
首先,浏览器在解析这段代码前,是先把代码中的变量 i和k放到了代码最前面。还有函数表达式。
上例:
 var i ;
 var k ;
 function fn(){};
 fn();
 console.log(i);//此处的console.log(i) 的结果是undefind;从执行循序来看是无法获取到i的值的。
 i=10;
 k=20;
 console.log(k);//此处k的值就是打印出来就是 20;从执行顺序来看,可以获取到k的值。

#变量的作用域

函数的书写形式

要想了解变量的作用域需要先明白创建函数的三种形式
声明函数是使用function关键字+函数名来声明的函数
例:
    function test(){

    };
函数表达式是使用function关键字,但没有函数名,把函数赋值给一个变量的函数。
例:
        var i = function(){

        };
匿名函数是直接使用关键字来声明的函数的。
例:
    function(){
    };
函数表达式和声明函数的区别:
 函数表达式可以直接使用()操作符。()表示立即执行。声明函数不可以直接使用。
 想要使用的话,可以先把声明函数包装为函数表达式的形式。可以在对声明函数添加+、-、()等符号。推荐使用().
 例:声明函数包装为函数表达式,使用();
        (function(){
             console.log('嘿嘿!')
        })();
         函数表达式使用();
         a = function test(){
             console.log('啊,你是嘿嘿呀!')
         }();

作用域

首先了解下全局变量和局部变量。
    在js中 使用 var 的定义的变量叫做局部变量。直接定义的变量就是全局变量。
例:
 var i= 10; i 这个变量就是局部变量
  i= 10 ; i 这个变量就是全局变量
变量的作用域
    例1var a = 10;//a 是局部变量,如果它没有在function中,它的作用域就是整个js;
      b = 20; // b是全局变量,作用域是整个js;
     function fn (){
         var c =30 ; //c是局部变量,它的作用域是在fn函数下。
         function fn1(){
             i = 40; //i 是全局变量,它的作用域是在整个js下。
             var c = 40 ;//c 是局部变量,它的作用域是在fn1下。
             var d = 50;  //d 是局部变量,它的作用域是在fn1下。
             console.log(a);
                }
         fn1();

     }
     fn()
     例2function fn(){
         var c=30;
         function fn1(){
          console.log(c)//此时c的值就使它父级function的c的值30;
         }
     }
 小结;当变量是全局变量时,不论变量有没有在function下,变量的作用域都是整个js。当变量定义为局部变量时,
 如果变量没有在function下,它的作用域就是整个js。如果在function下,就作用域这个function。
 如果在function下有使用变量,却没有定义时,
 就往上找到它的父级function,继承它父级function的值。

函数的使用方法拓展

在外部使用函数内部的变量

1var  j=function(){
          var max = 10;
          return function(){
            return 1;
          }()
  }        
 var a = j ();//把值赋予a 方便调用。
 console.log(j());
 例2function fn (){
         var max = 10;
         var fn2 = function(num){
              if(num>max){
                  console.log(max);
                  console.log(num);

              }

         }
         return fn2;//fn2 是fn函数的返回值
  }
     var news=fn();//fn()是等于fn2的。
     news(30);//news 调用的是fn2

计算函数参数值的和的方法

1function jisuan(){
      var fuhao = arguments[arguments.length-1];

    // var  changdu = arguments.length;

    if(fuhao=='+'){
        for(var i= 1 ;i<arguments.length-1;i++){

            arguments[0]+=arguments[i]
        }
        return arguments[0];
        } else if (fuhao=='-') {
        for(var i = 1;i<arguments.length-1;i++){
            arguments[0]-=arguments[i]
        }
        return arguments[0];
    } else if (fuhao=='*'){
        for(var i = 1;i<arguments.length-1;i++){
            arguments[0]*=arguments[i]
        }
        return arguments[0];
    }else if (fuhao='/') {
        for(var i = 1;i<arguments.length-1;i++){
            arguments[0]/=arguments[i]
        }
        return arguments[0];
       }

};
jisuan(10,20,30,'+');
console.log(jisuan(10,20,30,'+'));
console.log(jisuan(1,2,3,'-'));
console.log(jisuan(1,2,3,'*'));
console.log(jisuan(1,2,3,'/'));

on the way 路