Skip to content

数据类型 2.6函数 1.5函数声明的提升可修改  #251

Closed
@fhzm

Description

@fhzm

注意,如果像下面例子那样,采用function命令和var赋值语句声明同一个函数,由于存在函数提升,最后会采用var赋值语句的定义。

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

function f() {
  console.log('2');
}

f() // 1

上面例子中,表面上后面声明的函数f,应该覆盖前面的var赋值语句,但是由于存在函数提升,实际上正好反过来。
以上是原文
修改建议
变量提升发生在预编译的时候,而预编译又发生在代码执行之前, 如果是在全局作用域下 会先找var 定义的变量名作为作用域下是属性名,值为undefined 然后找函数声明的函数名作为作用域下的属性名,它的值就是函数体,如果已经有相同的属性名就直接将函数体赋值给它,所以上面的代码如果把f()放在var f 之前执行它执行的结果是2,

f() // 2
var f = function () {
  console.log('1');
}

function f() {
  console.log('2');
}

放到最后执行结果为1的原因是代码一行一行往下走,var f 与function f都提升上去 了 下面只剩下 f=function(){console.log(2)} f()
而在函数作用域里面,过程与全局作用域大致相同,只是会先找var定义的变量名以及形参名,然后将实参的值赋值给形参,接着再找函数声明,并赋值函数体,
简单理解就是不管是全局作用域还是函数作用域,变量 提升的变量名与变量值优先使用的是函数声明的函数名以及函数体,其次才是形参名,形参值,最后才是声明命令声明的变量名以及所赋给的值
如果采纳修改建议还望阮老师能够自己组织一下语言

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions