wangdoc/javascript-tutorial

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

fhzm opened this issue · 2 comments

fhzm commented

注意,如果像下面例子那样,采用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定义的变量名以及形参名,然后将实参的值赋值给形参,接着再找函数声明,并赋值函数体,
简单理解就是不管是全局作用域还是函数作用域,变量 提升的变量名与变量值优先使用的是函数声明的函数名以及函数体,其次才是形参名,形参值,最后才是声明命令声明的变量名以及所赋给的值
如果采纳修改建议还望阮老师能够自己组织一下语言

原文比较简单。

fhzm commented