js声明前置时候,是变量声明先前置还是函数声明先前置?

js声明前置时候,是变量声明先前置还是函数声明先前置?怎么证明

阅读 5.8k
7 个回答

这真是个刁钻的问题,讲真这个很难讲清到底谁会先声明,个人理解js的变量和函数声明分成三个阶段:申明,初始化,赋值。申明表示代码解析的时候表明我现在这个作用域里有这个变量了,这个过程在es5里表现不明显,但是es6里的let变量的表现就表明。初始化就是对变量和函数附上初始值,最后就是赋值将用户的值附给对应的变量和函数。正常我们说的声明提前是对于var变量指的是 申明+初始化(let不一样,他有临时性死区其实际上应该也算有提前,申明这个过程提前了),而函数的声明提前指的是 申明+初始化+赋值,最重要的是解析器是将当前作用域内声明的所有变量和函数都会放到作用域的开始处,所以谁先谁后不重要,可能是先变量后函数,也可能是谁在前谁先来不按种类分,具体的可能就得看解析器到底是怎么做的了。

变量申明和函数声明都会前置,同时,var变量变量会先于函数更优先申明,但是变量的赋值不会提升

console.log(aaa, bbb);

function bbb(){}
var aaa = 1;

console.log(aaa, bbb);

函数提升优先于变量提升。可以自行写个demo测试。

给你看这篇吧http://www.jianshu.com/p/d5a4...

好吧我具体说说吧。如果有谁一句话就试图概括这里面的规则,谁肯定是瞎说。

函数声明覆盖变量定义,无论谁先写谁后写

函数声明会被变量赋值覆盖,无论谁先写谁后写

这已经是最精炼的规则。

foo();
var foo=10;
function foo(){}
//如果你认为变量提升先,就是
var foo;
function foo(){console.log("aa")}
foo();//肯定是打印aa啦
//如果是函数声明先,就是
function foo(){console.log("aa")}
var foo;//重复声明无效
foo();//结果还是打印aa
那么问题来了,谁先谁后是重点吗????如果我理解错了,请指教

首先,变量提升 准确讲是指 变量的声明提升至当前作用域顶部,而变量的赋值是不会提升的;

其次,变量声明的提升是先于函数声明的提升的;

Test Code:

console.log(a);
console.log(b);

function b() {
    console.log(a);
}

b();
var a = 10;

console.log(a);

现在ES6已经不提倡用var了,let可以解决你变量提升的烦恼

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题