做用域

1.做用域概述

一般来讲,一段程序代码中所用到的名字并不老是有效和可用的,而限定这个 名字(变量)的可用性的代码范围就是这个名字的做用域,做用域的使用提升了程序逻辑的局部性,加强了程序的可靠性,减小了名字冲突es6

1.1.js做用域(es6以前)分为: 全局做用域 局部做用域

1.2.全局做用域 :整个script标签 或者是一个单独的js文件

var num = 10 ;(这一个标签是写在全局做用域里面 这个变量名是可用的 称之为全局做用域)

1.3.局部做用域(函数做用域):在函数内部就是局部做用域,这个代码的名字只在函数内部起效果和做用

var num = 10  //局部做用域
 function fn(){
  //局部做用域
   var num = 20 ; //局部下的num和全局下的num是不冲突的由于输出的不同
   console.log(num) //20
 }
 fn()  //切记调用
 console.log(num) // 10

2.变量做用域

在js中,根据做用域的不一样,变量能够分为俩种:全局变量,局部变量

2.1.全局变量:在全局做用域下的变量 在全局下均可以使用(在函数外部定义的变量)(3.特殊状况注意一下:若是在函数内部,没有声明直接赋值的变量也属于全局变量)

var num=10;
  console.log(num);//能够打印  10 
  function fn(){ //函数
    console.log(num)//也是能够打印的 10 
           }
           fn()
            console.log(aru) //4.aru is not defined   不能使用

2.2.局部变量:在局部做用域下的变量 或者能够理解为在函数内部的变量就是局部变量(在函数内部定义的变量)(注意:函数的形参也能够看作是局部变量 4.aru是一个形参)

function fun(aru){
  var num = 10; //1.num就是局部变量 特色就是只能在函数内部使用
  num = 20; //3 . 若是在函数内部,没有声明(不适用var)直接赋值的变量也属于全局变量
}
fun();
console.log(num);  //2.num is not defined 报错  因此说外部是不能使用的
console.log(num); //3. 20 若是在函数内部,没有声明直接赋值的变量也属于全局变量

2.3.区别:从执行效率来看全局变量和局部变量
(1)全局变量在任何一个地方均可以使用,只有浏览器关闭的时候才会销毁,比较占内存资源
(2)局部变量 当咱们程序执行完毕就会销毁,比较节约内存资源浏览器

3.做用域链

3.1.只要是代码,就至少有一个做用域

var num = 10; //全局做用域函数

3.2.在函数内部的叫作局部做用域

var num = 10;
function fun(){  //外部函数
  var num = 20; 
  function fn(){//3.3.在fun函数里面有生成了一个fn函数   做用域里面诞生了一个新的做用域   内部函数
  console.log(num);//3.4.执行是20仍是10呢 20  用链式查找决定  它会往上一级找有没有num 一层一层的找就是链式查找
   }
   fn()
}
fun()

3.3.若是函数中还有函数,那么在这个做用域中就有能够诞生一个做用域

3.4.根据在内部函数能够访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称为做用域链(简单理解就是就近原则,谁离的近就执行谁)

案例1:

function f1(){   //1  能够称为0级链
  var num = 123;    //2  能够称为1级链
  function f2(){    //2  能够称为1级链
     console.log(num);    //3 能够称为2级链       123
  }  
  f2()
}
var num = 456;  //1 能够称为0级链
f1();

案例2:

var a = 1;
 function fn1(){
    var a = 2;
    var b = '22';
    fn2();
    function fn2(){
       var a = 3;
       fn3();
       function fn3(){
          var a = 4;
          console.log(a);   //4
          console.log(b);   //22
        }
    }
  }
 fn1();

2、预解析

.1问

console.log(num) //num is not defined

.2问

console.log(num) //undefined   坑1
var num = 10; 
~ //至关于执行了如下代码 
var num;
console.log(num);  //只声明不赋值  因此输出就是 undefined
num = 10;

.3问(直接函数声明 利用关键字来进行声明)

function fn(){
  console.log(11)  //11  
}
fn();

.4问 (函数表达式采用了表达式赋值形式 这里使用function赋值的没办法进行函数提高)

//fun()  //若是放到上面调用呢   undefined  坑2
var fun  = function(){   
  console.log(22) //22  
}
fun() 
~//至关于执行了如下代码 
var fun;     //只声明不赋
fun();      //没有这个函数调用确定会报错  因此正确写法是将fun写到后面
fun = function(){   //函数表达式
  console.log(22) //22  
}
fun();

1.什么是预解析

js代码是由浏览器中的js解析器来执行的,js解析器在运行js代码的时候分为俩步:预解析和代码执行

1.1.预解析 : js引擎会把js 里面全部的var 还有function 提高到当前做用域的最前面

1.2.代码执行 : 按照代码的书写顺序从上往下执行

2.预解析分为 变量预解析(变量提高) 和 函数预解析(函数提高)

2.1.变量提高 就是把全部的变量声明提高到当前的做用域最前面 不提高赋值操做

2.1.函数提高 就是把全部的函数声明提高到当前做用域的最前面 不调用函数(函数表达式 调用必须写在函数表达式下面)

相关文章
相关标签/搜索