博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascript 函数和变量提升
阅读量:7071 次
发布时间:2019-06-28

本文共 1952 字,大约阅读时间需要 6 分钟。

变量提升和函数提升基本上是面试必问题目
//先从一个面试题说起        console.log(a)        if (a) {            var a = 1;            console.log(a)        }        function a() {            console.log(this);        }        console.log(a);        a()        复制代码

下面我们针对这个栗子解析一下

我们知道变量和函数定义都会提升到作用域最前边

唯一需要确认的是变量和函数的先后顺序

我们预想 函数是用第一公民会不会提升到最前边呢?

//如果是解析完顺序是这样的        function a() {            console.log(this);        }        var a;        console.log(a)        if (a) {            a = 1;            console.log(a)        }        console.log(a);        a()复制代码

按照我们预想的解析结果应该是

// undefined // undefined // 报错

理由 函数在上var在下,第一个console时a未赋值,其结果是undefined,if为false 只剩最后一个console也是undefined 最后a is not a function.

不过结果是

我机智的认为 预想错了?

//再次测试        var a;        function a() {            console.log(this);        }        console.log(a)        if (a) {            a = 1;            console.log(a)        }        console.log(a);        a()复制代码

这样?对比一下结果 人工解析结果 : 1、a() 2、1 3、1 4、a() 报错

浏览器执行结果:

没毛病!

看到这里一切完美,不过我还是重新搜索了一些高质量文章,发现我错了,虽然执行结果是对的,不过浏览器和人工解析还是不一样的,和我们最开始预想的一样,函数优先。

既然标题说到了 变量 和 函数,我们就一块来说说

//简单的栗子function a(){ console.log(a) }console.log(a)var a = 1a()复制代码

首先上边已经说到我们预想和认为的是错的。

正确解析顺序是这样的

function a(){ console.log(a) }var a;console.log(a)a = 1a()复制代码

但是,这个但是很重要浏览器执行结果是:

why?这就要讲讲我所了解到的原理。

同名变量和函数,函数会提升到最前边,变量其次,那为什么结果不是我们人工执行的undefined呢?原因是 变量会被忽略,是的是忽略。。。

function a(){ console.log(a) }var a;//忽略console.log(a) //打印函数本身a = 1a()// a is not a function复制代码

完美!

还有呢?是的还有同名变量是怎样的顺序,同名函数是怎样的顺序。

同名变量
console.log(a)var a = 1console.log(a)var a = 2console.log(a)//解析完顺序是这样的var a;var a; //忽略console.log(a) // undfineda = 1console.log(a) //1a = 2console.log(a)//2复制代码

*同名变量,声明会被提升,后边会忽略。

同名函数
function a(){console.log(1)}console.log(a)function a(){console.log(2)}console.log(a)a()//解析完function a(){console.log(1)}function a(){console.log(2)}console.log(a)console.log(a)a()复制代码

执行结果

我想你已经猜到了,同名函数会被覆盖。

终于完了!

您的点赞是我继续下去的动力,谢谢!

转载于:https://juejin.im/post/5c6a859ff265da2d9262d603

你可能感兴趣的文章
字节流与字符流的一些个人看法
查看>>
狄泰学院_十二月提升_ 学习任务(2017.03.02 -- 2017.03.08)
查看>>
【Django笔记一】windows系统下搭建Django项目
查看>>
linux:SUID、SGID详解
查看>>
【转】大数据批处理框架 Spring Batch全面解析
查看>>
EChars学习-2
查看>>
Python模块--psutil
查看>>
新版App Store有哪些变化呢
查看>>
分布式搜索方案选型
查看>>
AIR文件操作(二):使用文件对象操作文件和目录
查看>>
mongodb的删除语句
查看>>
Linux 实用技巧
查看>>
hadoop-
查看>>
团队博客
查看>>
4.Struts2中Action的三种访问方式
查看>>
delphi 10.3 IOS中英文错位
查看>>
初识RabbitMQ
查看>>
“Linux内核分析”实验二
查看>>
WCF使用MSMQ通信
查看>>
前后端分离djangorestframework——权限组件
查看>>