js函数声明提升与变量提升
2017-03-22 14:12
736 查看
变量提升
变量提升: 在指定作用域里,从代码顺序上看是变量先使用后声明,但运行时变量的 “可访问性” 提升到当前作用域的顶部,其值为 undefined ,没有 “可用性”。alert(a); // undefined var a = 3; alert(a); // 3
相当于:
var a; alert(a); // undefined a = 3; alert(a); // 3
函数声明提升
foo(); // hello function foo () { alert("hello"); }
相当于:
var foo = function () { alert("hello"); }; foo();
函数表达式:
alert(foo); // undefined foo(); // TypeError: foo is not a function var foo = function () { alert("hello"); };
相当于:
var foo; alert(foo); // undefined foo(); // TypeError: foo is not a function foo = function () { alert("hello"); };
变量与函数名相同时
1)函数声明会置顶(置顶成函数表达式)2)变量声明也会置顶 (函数表达式看成变量形式),(变量与函数置声明顶都是在当前作用域下)
3)函数声明比变量声明更置顶:(函数在变量上面) 变量赋值>函数声明>变量声明
4)变量和赋值语句一起书写,在js引擎解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置
5)声明过的变量不会重复声明(同一作用域下)
var a = 2;
var a = 3;
JS会默默忽略掉第二个var声明来将程序继续执行下去,而且后面声明的值会覆盖掉前面声明的值
如果重复声明的一个变量有初始值,那么它担当的不过是一个赋值语句的角色.
如果重复声明的一个变量没有初始值,那么它对原来的变量没有任何影响.
最终一切皆为声明变量,然后赋值形式(分解开来分析即可)
var a = 100; function a () { alert(100); } a(); // TypeError: a is not a function
相当于:
var a = function () { alert(1); }; var a = 100; a();
函数内部的变量提升与函数声明提升(提升到当前作用域顶部)
变量提升与函数声明提升不会超过参数function fn (b) { console.log(b); function b () { console.log(b); } b(); } fn(10);
运行结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/10/9b1bbedaf42309f186c231d5df61783d.png)
相当于:
function fn () { var b = function () { console.log(b); }; console.log(b); b(); } fn(10);
一些题目:
1.var a = 1; function fn () { if (!a) { var a = 2; } alert(a); } fn(); // 2
2.
if (! "a" in window) { var a = 1; } alert(a); // undefined
3.
var a = 1; function fn() { a = 2; return; function a() {} } fn(); alert(a); // 1
相关文章推荐
- JS变量声明提升、函数声明提升
- Js 变量声明提升和函数声明提升
- js变量和函数声明的提升(转)
- Js 变量声明提升和函数声明提升
- JS面试中的的变量提升和函数声明
- 第24天:js-函数变量声明提升
- JS 变量和函数的声明提升
- js变量声明提升,变量作用域与函数作用域,作用域链
- js代码执行过程,js预编译,变量声明提升,函数体整体提升
- Js中有关变量声明和函数声明提升的问题
- JS中的函数声明提升和变量声明提升
- js 函数定义,使用,作用域,变量声明提升,遇解析.....
- Js中有关变量声明和函数声明提升的问题
- javascript的变量声明和函数声明提升
- js 变量、函数提升
- javascript的变量声明和函数声明提升
- JavaScript基础:JS函数中声明的所有变量在整个函数中都是有定义的
- javascript的变量声明和函数声明提升
- javascript的变量声明和函数声明提升
- JS 变量声明提升(Hoisting)