变量提升和函数提升

94 阅读2分钟

这里是大熊,记录自己的想法!

无关紧要

今天意外收获一道面试题,让我们先进行大胆的猜测。没错这道面试题与此文章无关,但是它也是勾起了我的一些关于其它方面的回忆(狗头表情)先把题贴在下方,知道原因的可以在评论区展开讲讲~ 8e7795513f7321d1454fdf6a3eee344.jpg

回到正题

回到我们文章中,变量提升和函数提升大伙估计整得比我还明白。

变量提升大概就是使用 var声明的变量会在js编译阶段给提升到当前作用域的最顶端,但是赋值操作仍旧保留在当前位置(开发中用var会被刮目相待)。

console.log(a) // undefined
var a = 1
console.log(a) // 1

// js编译后
var a
console.log(a)
a = 1
console.log(a)

函数提升是以 function xxx() {}的形式去声明我们函数时,也是会在js编译阶段提升到当前作用域最顶端,这里不一样的是整个函数都被提升了,所以你在声明它之前就调用也是可以滴。

fn() // 漏漏漏
function fn() {
  console.log('漏漏漏')
}

// js编译后
function fn() {
  console.log('漏漏漏')
}
fn()

陷入沉思

当我得知js有变量提升和函数提升时,一直有一个无形的问题缠绕着我,如果函数和变量是相同的命名,那么它们到底谁在最顶端呢?(没错这个问题我现在依旧有,所以我只想先抛出我的疑问,等待大佬的解答)

console.log(typeof a) // function
var a = 1
function a() {}
console.log(typeof a) // number

查阅的资料普遍都说是函数提升比变量提升优先级更高,现在我有两种想法,如下

// 1. 函数优先
function a() {}
var a // 重复声明,js会忽略
console.log(typeof a) // function
a = 1
console.log(typeof a) // number

// 2. 变量优先
var a
function a() {} // 将变量a重新赋值为函数
console.log(typeof a) // function
a = 1
console.log(typeof a) // number

咋一看,两种想法好像都合理,所以js真正的处理是怎样的过程呢?等待有缘大佬帮忙解释。

哈哈哈,感觉自己在钻牛角尖,是时候该放下脚步停一停歇了。现在我觉得它们谁先都无所谓了,都是在操作同一块空间a