关于JavaScript中变量和函数的提升

论坛 期权论坛 期权     
菜鸟Code   2019-7-14 06:00   3012   0
  • 在我们正常的工作中很少会遇到这种关于变量、函数的提升问题,但是在我们面试的时候都喜欢问的,真不知道面试官怎么想的,而我们这些菜鸟往往就会在这里出现问题。
  • 废话不多说,开始正文
  • 首先我们都知道再执行js文件时,会分为两部,编译和执行,变量、函数的提升就在编译的时候完成的
  • 记住要点:
  • ***提升的是变量名而不是变量值
  • ***变量的提升只会对var 声明的变量进行提升
  • 1.关于变量的提升
  • 类似于 a = 1;的这种编译的时候就会写成
  1. var a;a = 1
复制代码

  • 2.关于函数的提升
  • 分为 函数声明式 和 函数字面量式
  • 函数字面量的提升与变量的提升是一样的,顺序的话就是看谁前谁后了
  • 函数声明式的提升就不一样了,函数声明式的优先级高于变量的优先级。也就是在提升时,函数声明式 总是在 变量 的前面的——(后半句错误!!!)
下面看具体的例子
1.先看变量的提升
  1. console.log(a)      //结果为:a is not defined  报错了b = 1;console.log(b)    //结果为:1var c = 2;console.log(c)    //结果为:2
复制代码
实际以上代码会编译为下面的,然后再从上向下执行
  1. var b;var c;console.log(a);b = 1;console.log(b);var c = 2;console.log(c)
复制代码
2.函数的提升(函数声明式)
  1. console.log(aa);             //结果为  undefinedconsole.log(bb);             // 这个将会报错  bb is not defined 变量的提升只会对var声明的变量进行提升,所以就未定义呗!bb = 10var aa = 100;function fn() {    console.log(aa);         //结果为  undefined    var aa = 200;    console.log(aa);   //结果为 200}fn();console.log(aa)            //结果为  100
复制代码
实际以上代码会编译为下面的,然后再从上向下执行
  1. var aa;function fn() { var aa; console.log("函数内部的 "+aa);           //第二结果   函数内部的 undefined aa = 200; console.log("函数内部的 "+aa)      //第三个结果   函数内部的 200}console.log("变量 "+aa)                              //第一个结果  变量 undefinedconsole.log(bb)bb = 10aa =100fn()console.log("变量 "+aa)      //第四个结果  变量 100
复制代码
当然上面的bb报错了执行不了,测试的时候得注释掉
3.函数的提升(函数字面量式)
  1. fn1();                                          //报错了   fn1 is not a functionvar fn1=function (){ console.log(1)}
复制代码
实际以上代码会编译为下面的,然后再从上向下执行
  1. var fn1;fn1();                                           //很明显fn1是一个未赋值的变量,并不能用调用函数的方式调用fn1 = function(){ console.log(1)}
复制代码
纠正一个错误:
就是函数提升的优先级比变量提升的优先级高,这句话对着呢,但是他们两之间是变量先提升,函数后提升。那么关于他们的优先级说的是,提升的时间,函数提升的时间比变量提升的时间晚,后执行,所以说是函数提升的优先级高于变量。看下面的列子
  1. function a(){}var a;console.log(typeof a)                 //结果是  function
复制代码
如果是函数先提升的话,输出的应该是 undefined

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP