扫码关注官方订阅号
js声明前置时候,是变量声明先前置还是函数声明先前置?怎么证明
走同样的路,发现不同的人生
这真是个刁钻的问题,讲真这个很难讲清到底谁会先声明,个人理解js的变量和函数声明分成三个阶段:申明,初始化,赋值。申明表示代码解析的时候表明我现在这个作用域里有这个变量了,这个过程在es5里表现不明显,但是es6里的let变量的表现就表明。初始化就是对变量和函数附上初始值,最后就是赋值将用户的值附给对应的变量和函数。正常我们说的声明提前是对于var变量指的是 申明+初始化(let不一样,他有临时性死区其实际上应该也算有提前,申明这个过程提前了),而函数的声明提前指的是 申明+初始化+赋值,最重要的是解析器是将当前作用域内声明的所有变量和函数都会放到作用域的开始处,所以谁先谁后不重要,可能是先变量后函数,也可能是谁在前谁先来不按种类分,具体的可能就得看解析器到底是怎么做的了。
变量申明和函数声明都会前置,同时,var变量变量会先于函数更优先申明,但是变量的赋值不会提升
console.log(aaa, bbb); function bbb(){} var aaa = 1; console.log(aaa, bbb);
函数提升优先于变量提升。可以自行写个demo测试。
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可以解决你变量提升的烦恼
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
这真是个刁钻的问题,讲真这个很难讲清到底谁会先声明,个人理解js的变量和函数声明分成三个阶段:申明,初始化,赋值。申明表示代码解析的时候表明我现在这个作用域里有这个变量了,这个过程在es5里表现不明显,但是es6里的let变量的表现就表明。初始化就是对变量和函数附上初始值,最后就是赋值将用户的值附给对应的变量和函数。正常我们说的声明提前是对于var变量指的是 申明+初始化(let不一样,他有临时性死区其实际上应该也算有提前,申明这个过程提前了),而函数的声明提前指的是 申明+初始化+赋值,最重要的是解析器是将当前作用域内声明的所有变量和函数都会放到作用域的开始处,所以谁先谁后不重要,可能是先变量后函数,也可能是谁在前谁先来不按种类分,具体的可能就得看解析器到底是怎么做的了。
变量申明和函数声明都会前置,同时,var变量变量会先于函数更优先申明,但是变量的赋值不会提升
函数提升优先于变量提升。可以自行写个demo测试。
首先,变量提升 准确讲是指 变量的声明提升至当前作用域顶部,而变量的赋值是不会提升的;
其次,变量声明的提升是先于函数声明的提升的;
Test Code:
现在ES6已经不提倡用var了,let可以解决你变量提升的烦恼