变量提升

81 阅读2分钟

变量提升个人理解:每次当控制器(js引擎)转到可执行代码的时候,就会进入一个执行上下文。也就是当前代码的执行环境,而在执行上下

文的生命周期中,有两个阶段,一个创建阶段,一个执行阶段。创建阶段的第一步是创建变量对象,而创建变量对象的三步:(变量函数的形

参)、(var, 变量声明)、(函数声明)。 而执行阶段才会变量赋值,就是先声明,后赋值。

而创建变量对象的三步:(变量函数的形参)、(var, 变量声明)、(函数声明)。 是有顺序的 (函数声明)>(var, 变量声明)

变量提升:
字面量式函数
(function () {}); var a= function() {}; var obj = {fn: function() {}};

声明函数
function test(){}

js中创建函数有两种方式:函数声明式和函数字面量式。只有函数声明才存在函数提升!

(function T(){
alert(1)
})()

var T1=function(){
alert(1)
}();

var para1={a:1,b:2,c:'Ok'}
var T1=function(obj){
alert(obj.c)
}(para1);
弹出ok

//如果不用自执行方式,就得调用
function T(){
alert(1)
}
T();//调用

创建阶段,function声明优先级比var高,因此var的同名会被忽略。执行阶段,赋值的操作是由foo='Hello'来完成。var foo = 'Hello'是要分

成两步来执行的

  • 变量未初始化(未赋值)就 调用该变量 的时候,创建阶段,function声明优于var 声明
  1. 若存在 function 属性,则调用该函数体(同名则覆盖);若不存在则 undefined
  • 变量初始化就 调用该变量 的时候,执行阶段,var 声明优于function声明
  1. 若存在 var 属性,优先执行,同名则覆盖。

  2. 若不存在var属性,存在 function 属性,则执行 function 属性函数体,否则为undefined

都是变量声明,属性相同情况下,后来声明将被跳过,但赋值不会跳过。
var a = 1; var a = 10;第二个a声明跳过,但执行阶段赋值是10对吗?

如果是属性相同的函数声明和变量声明,函数声明优先级最高,所以执行阶段前将会是持有函数引用,但是由于赋值操作在执行阶段,最后总

会被重新赋值,覆盖原先的函数引用

你要记住,只要是var声明的,都是变量声明,而不是函数声明