美文网首页
Javascript变量提升和函数提升详解

Javascript变量提升和函数提升详解

作者: 我是一个前端 | 来源:发表于2019-01-08 11:15 被阅读0次
变量提升和函数提升基本上是面试必问题目
//先从一个面试题说起
        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.

不过结果是


image.png

我机智的认为 预想错了?

//再次测试
        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() 报错

浏览器执行结果:


image.png

没毛病!

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

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

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

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

正确解析顺序是这样的

function a(){ console.log(a) }
var a;
console.log(a)
a = 1
a()

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


image.png

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

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

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

完美!

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

同名变量
console.log(a)
var a = 1
console.log(a)
var a = 2
console.log(a)

//解析完顺序是这样的

var a;
var a; //忽略
console.log(a) // undfined
a = 1
console.log(a) //1
a = 2
console.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()

执行结果


image.png

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

终于完了!

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

相关文章

  • Javascript变量提升和函数提升详解

    变量提升和函数提升基本上是面试必问题目 下面我们针对这个栗子解析一下 我们知道变量和很熟定义都会提升到作用域最前边...

  • 变量提升 & this指向

    变量提升 JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。JavaScript 中,变量可以在...

  • var与let、const的区别

    什么是变量提升?JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。JavaScript 中,变量...

  • js的提升

    JavaScript 会将函数声明和变量声明提升到当前作用域的顶部。变量赋值不会提升。在脚本的顶部声明函数和变量,...

  • runoob js第六天

    JavaScript 变量提升 变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。变量可...

  • Javascript变量提升和函数提升

    Javascript引擎的工作方式是:先解析代码,获取所有被声明的变量,然后再一行一行的运行。 一.变量提升 在E...

  • JavaScript 变量提升和函数提升

    一、变量提升 在ES6之前,JavaScript没有块级作用域,只有全局作用域和函数作用域。 1.所指的形式:必须...

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

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

  • JavaScript 坑与技巧:变量作用域

    变量作用域 变量提升 JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”...

  • 变量作用域与解构赋值

    变量提升 JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部:...

网友评论

      本文标题:Javascript变量提升和函数提升详解

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