变量提升个人理解:每次当控制器(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 声明
- 若存在 function 属性,则调用该函数体(同名则覆盖);若不存在则 undefined
- 变量初始化就 调用该变量 的时候,执行阶段,var 声明优于function声明
-
若存在 var 属性,优先执行,同名则覆盖。
-
若不存在var属性,存在 function 属性,则执行 function 属性函数体,否则为undefined
都是变量声明,属性相同情况下,后来声明将被跳过,但赋值不会跳过。
var a = 1; var a = 10;第二个a声明跳过,但执行阶段赋值是10对吗?
如果是属性相同的函数声明和变量声明,函数声明优先级最高,所以执行阶段前将会是持有函数引用,但是由于赋值操作在执行阶段,最后总
会被重新赋值,覆盖原先的函数引用
你要记住,只要是var声明的,都是变量声明,而不是函数声明