提升

作者: BIGHAI | 来源:发表于2017-05-27 11:06 被阅读0次

首先,JavaScript代码在执行时是从上到下一行一行执行的这种说法并不十分正确。

先看两个例子:

a = 2
var a
console.log(a)

上面的例子的输出结果为2

console.log(a)
var a = 2

上面的例子的输出结果为undefined

分析:引擎在运行JavaScript代码之前会先对其进行编译工作。而编译过程的一部分工作就是找到所有的声明,并用合适的作用域来安置他们。因此,分析代码的正确思路是:包括变量和函数在内的所有声明都会在任何代码运行前首先被处理。上面所说的这种现象就是我们称作的“声明提升”现象。

1.函数声明和函数表达式的声明情况

函数声明是会被正确提升的,但是对于函数表达式的声明则会不尽人意,当然这也是合理之中的设计。

foo()//it's okay
function foo(){console.log(1)}

fun()//TypeError
var fun = function(){console.log(1)}

分析:对于函数表达式的提升而言,首先函数变量会被提升,但是他的类型却是不可知的,因为类型必须根据等号右边才能够推断的出来,但是等号右边的内容那是运行时才能知道的,所以对于函数表达式的声明提升而言,函数变量被提升为了undefined,如果你对函数变量进行调用操作的话,则会发生TypeError错误。而非ReferenceError错误。
再看一下下面这种例子:

fun()//TypeError
bar()//ReferenceError
var fun = function bar(){...}

还有就是得格外注意这种情况:

var foo = function bar(){...}
bar()//ReferenceError

对于上面这种情况,记住就好。

2.函数优先

前面提到过,不论是函数声明还是变量声明都会得到声明提升,但是一个值得注意的地方是如果定义了一个同名函数变量和一个普通变量的话,而且此时都是声明提升的话,那么无论函数声明的位置是在变量之前还是之后,结果都是在查找这个变量时函数被优先考虑举个例子:

foo()
function foo(){console.log(1)}
foo = 1
var foo

上面的输出结果并不是ReferenceError,而是输出了1。对于这种情况,感觉解释时解释不通的。所以需要记住的就是:** 当同名的函数变量和普通变量都声明提升时,那么当在他们两者的声明之前查询该变量的时候,查询得到的结果将一定是函数,无论声明位置的先后顺序 **。
当然,如果不是在两者的声明之前调用的话,那么就不会出现这种情况:

function fun(){...}
fun = 1
var fun
fun()//TypeError,fun is not a function

END

相关文章

  • 提升

    今天听到最多的词就是提升,提升不光要提升顾客,也要提升自己,提升自己的知识,提升品味,提升心灵,提升穿衣打扮,提升...

  • 好好学习!天天向上!向上提升境界

    提升学习能力,提升认识的角度, 提升认知层次,提升思想高度 提升思维能力,提升意识能量 提升内心境界,提升觉知智慧...

  • 五招教你如何效率提升

    效率提升的包含五个方面:个人效率提升、组织效率提升、资产效率提升、战略效率提升、创新效率提升。 一、个人效率的提升...

  • 关于变量提升

    函数提升的优先级要高于变量提升,变量提升到函数声明的后面; 变量提升,但是赋值不提升,函数表达式不提升;

  • Javascript 变量执行过程 和 数组 & 对象的区别

    变量提升 JS执行过程1. 先提升(先提升函数,再提升变量,如果名字一样,变量提升会覆盖函数提升)2. 再执行,如...

  • 猪牛象的规矩2016.8.31

    一、宗旨: 1、提升、提升、提升,围绕高效个人提升的交流分享,抱团走向更高人生境界 2、提升方向参见兴趣元素 二、...

  • 有点严峻的疫情

    今日心语签 提升自己 提升技能,掌控人生 提升思维,权衡利弊 提升修养,举止斯文 提升觉悟,努力做事 ——#小来早...

  • 2018-01-12

    收获,技能专业的提升 气质的思考 多给别人留面子 把自己走丢了 提升提升提升

  • JS中的提升

    JS中包含两种提升,变量提升和函数提升。 变量提升 变量提升只能是var或者function声明的变量或者函数,l...

  • 蛋白线面部提升好吗?蛋白线提升后对比照片

    蛋白线面部提升好吗?蛋白线提升后对比照片 蛋白线面部提升好吗?蛋白线提升后...

网友评论

      本文标题:提升

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