美文网首页
作用域-变量和函数提升

作用域-变量和函数提升

作者: miner敏儿 | 来源:发表于2017-04-13 00:57 被阅读0次

变量和函数的提升可以分成两步:

  • 1 js先预解析:把变量和函数声明提升到作用域顶端,我理解的意思是在浏览器中找一些东西
    • var ; 函数function a(){}; 参数;
      所有变量,在正式运行代码之前都提前赋了一个值:未定义;
      只要有以上中的任意一个,就预解析;
    • 在预解析时遇到重名的只留下后一个;
    • 变量和函数重名的,就留下函数.
  • 2.逐行解读代码
  • 表达式:= + - * / % ++ -- 参数......
  • 表达式可以修改预解析的值
    直接上代码应该更好理解一点,先来个简单的代码,理解下

示例1:

alert(a);
 var a=1;

结果:undefined

  • 首先预解析 :
    通过var function 参数 ,在代码中有var 那么就把var a 提升到作用域顶端。
  • 接着读代码:
    第一行:alert(a);往预解析中找a,恩,找到了a 因为所有变量,在正式运行代码之前都提前赋了一个值:未定义;
    a=undefined;

示例2:

    alert(a);
    var a=1;
    function a(){alert(2);}

结果: function a(){alert(2);}
还是两步:

  • 预解析: var ; 函数function a(){}; 参数;
    var a=undefined;
    function a(){alert(2);}
    变量和函数重名了,干掉变量留下了函数
  • 读代码
    第一行:现在预解析中只有函数了,所以a的值就为function a(){alert(2);}

示例3:

alert(a); // function a(){alert(4);}
var a=1;
alert(a);//1
function a(){alert(2);}
 alert(a);//1
function a(){alert(2);}
 var a=3;
alert(a);//3
 function a(){alert(4);}
alert(a);//3
 a();//报错
  • 预解析 var ; 函数function a(){}; 参数;
    var a=undefined;
    function a(){alert(2);} //干掉前面变量 保留它
    function a(){alert(2);} //干掉前面函数 保留它
    var a //变量打不过函数 依旧保留前面函数
    function a(){alert(4);} //干掉前面函数 保留它 //最终保留的是此函数
    读代码时预解析中值得变化
    function a(){alert(4);}-->a=1--->a=3
  • 读代码
    alert(a) // 往预解析中找 只有function a(){alert(4);}
    var a=1; 表达式可以修改预解析的值 ,干掉函数--> a=1;
    alert(a)//1预解析中找到a ,a=1;
    function a(){alert(2);} 函数只是一个声明不会改变预解析的值
    alert(a);//1预解析中找到a 还是 a=1;
    var a=3; //改变预解析中a的值
    alert(a);//3
    function a(){alert(4);}//函数只是一个声明不会改变预解析的值
    alert(a);//3
    a()--->3()肯定报错 a为3不是函数 肯定不能调用;

示例 4

 var a=1;
    function fn1(){
        alert(a); //1
        a=2;
    }
    fn1();
    alert(a);  //2
  • 预解析 var ; 函数function a(){}; 参数;
    var a=undefined;
    读代码时预解析中值得变化
    a=undefined-->a=1-->a=2
  • 读代码
    var a=1; 表达式可以修改预解析的值 ,干掉函数--> a=1;
    fn(); 函数调用 又要预解析和读代码
    • 预解析:
      什么都没有 找不到 var ; 函数function a(){}; 参数;中的任意一个
    • 读代码:
      alert(a) 找不到a往上找 找到a=1;那么a=1;
      a=2; 表达式可以修改预解析的值 ,干掉a=1--> a=2;
      alert(a)此时预解析中a的值已经被修改为2了

示例5

 var a=1;
    function fn1(a){
        alert(a);
        a=2; //1
    }
    fn1(a);
    alert(a); //1

和上面代码相比只是添加了行参和实参

  • 预解析 var ; 函数function a(){}; 参数;
    var a=undefined;
    读代码时预解析中值得变化
    a=undefined-->a=1

  • 读代码
    var a=1; 表达式可以修改预解析的值 a=undefined--> a=1;
    fn1(a); 函数调用 又要预解析和读代码

    • 预解析:
      此时传递了一个实参a, a的值接受了全局变量a的值所以a=1.在function fn1(a){}中的形参实际上是function fn1(var a=1){} 所以在此次预解析时 a=undefined;

    读代码时预解析中值得变化
    a=undefined-->a=1-->a=2

    • 读代码:
      从参数开始读 本质是局部变量 a=1
      alert(a) 找到a=1;那么a=1;
      a=2; 表达式可以修改此次预解析的值 ,干掉a=1--> a=2;
      alert(a);在全局中a的值还是1 ,不会被改为2

示例6:

var a=1;
function fn1(a){
    alert(a);//undefined
    a=2;
}
fn1();
alert(a); //1

此时没有传实参

  • 预解析 var ; 函数function a(){}; 参数;
    var a=undefined;
    读代码时预解析中值得变化
    a=undefined-->a=1

  • 读代码
    var a=1; 表达式可以修改预解析的值 a=undefined--> a=1;
    fn1(); 函数调用 又要预解析和读代码

    • 预解析:
      在function fn1(a){}中的形参实际上是function fn1(var a){} ,因为没有传实参,所以在此次预解析时 a=undefined;

    读代码时预解析中值得变化
    a=undefined-->a=2

    • 读代码:
      从参数开始读 本质是局部变量a=undefined;
      alert(a) 找到a;那么a=a=undefined;;
      a=2; 表达式可以修改此次预解析的值 , a=2.
      alert(a);在全局中a的值还是1 ,不会被改为2

应该能读懂加理解了吧

相关文章

  • let const var

    变量提升 函数会优先于变量提升; 函数提升会把整个函数移到作用域顶部 变量提升智慧把变量的定义移到作用域顶部 wi...

  • js 的变量提升和函数提升

    1. 深入理解 js 的变量提升和函数提升 先了解:js没有块级作用域,只有全局作用域,和函数作用域 相同的函数名...

  • var let const之间的区别?

    1.var ①var声明的变量没有块级作用域,只有函数作用域和全局作用域 ②var声明的变量有变量提升 ③变量可以...

  • 2019-11-11-本周学习周报

    学习总览 JavaScript 函数作用域、块级作用域 变量提升、函数提升 CSS 新增属性transition ...

  • 块作用域和let、const

    在ES6之前,JavaScript没有块级作用域,只有全局作用域和函数作用域。 变量提升即将变量声明提升到它所在作...

  • 全面理解作用域

    es5:函数作用域、全局作用域 (var 、function有变量提升)es6:块级作用域 (没有变量提升...

  • JS 提升

    变量提升即将变量声明提升到它所在作用域的最开始的部分 在 js 中只有两种作用域,全局作用域和函数作用域,在ES6...

  • es6

    let const var 函数提升优先于变量提升,函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用...

  • let和var的区别

    var 和 let 都是用于变量声明的关键字 作用域var 是函数级作用域,let是块级作用域 变量提升问题 声明...

  • 作用域与变量提升

    作用域与变量提升 作用域 JS中变量的作用域有全局作用域和局部作用域两种,作用域简单来讲就是变量与函数的可访问范围...

网友评论

      本文标题:作用域-变量和函数提升

      本文链接:https://www.haomeiwen.com/subject/htyvattx.html