Javascript变量与函数的声明与提升
2017-02-13 21:21
381 查看
简单介绍编译与变量、函数声明的关系。
Javasript编译分两个阶段:
预编译阶段
将代码中的变量声明与声明式函数提前(预编译)
编译阶段
此时变量的赋值、函数执行等操作才会进行
上面的代码我们可以这样看:
注意:从上面的代码我们可以看到变量的声明部分提升,赋值部分并不会被提升。
上面的代码我们可以这样看:
函数表达式不会被提前
注意:我们尝试在函数表达式之后执行 foo(),结果抛出 ReferenceError: foo is not defined,当前作用域下找不到 foo,但是在 foo函数内部可以执行,也就是自己调用自己,注意会陷入死循环。
函数局部变量提升
局部变量在局部提升,外部访问不到。
声明同名函数
函数声明会被提前,同名函数后者会覆盖前者;
函数表达式不会被提前,同名变量声明 var foo; 提升会被忽略;
就是多个同名的变量声明,只会提升一次。
if else for等创建代码块的语句,内部声明函数
代码块内部函数声明是否提前不同浏览器表现不一致, IE9及以下(更高版本没试过) => 输出 2,
函数处于 if else 代码块中,预编译阶段将其全部提前,即使 else 部分不会执行。
高级浏览器(Chrome、Firefox) => 抛出 TypeError: foo is not a function
只将函数名提升,函数体并未提升。
我们将函数执行的放到if 代码块中
IE9以下浏览器表示一致; 高级浏览器 => 输出 1 。
低版本浏览器中,预编译阶段即使处于 if else 、for 等创建代码块的语句,会将函数声明提前。
而高级浏览器中,只会提前函数名,只有当执行到相应代码块时,才会将全部提前。
函数内部的变量、函数声明与参数
简述执行顺序:
1.预编译阶段,foo函数声明被提前;
3.执行并传参foo(1),形参 var a = 1;
4.函数内部预编译,a函数声明被提前,var a 变量提前被忽略。
5.输出a => function a () {// …}
6.赋值a = 2;
7.输出a => 2
个人学习总结,如有不足欢迎指正。
参考博客:JavaScript提升(你不知道的JavaScript)
Javasript编译分两个阶段:
预编译阶段
将代码中的变量声明与声明式函数提前(预编译)
编译阶段
此时变量的赋值、函数执行等操作才会进行
变量的声明
console.log(a); // undefined var a = 1; console.log(a); // 1
上面的代码我们可以这样看:
var a; // 变量a的声明被提升(预编译) console.log(a); // undefined a = 1; // 变量a被赋值为1 console.log(a); // 1
注意:从上面的代码我们可以看到变量的声明部分提升,赋值部分并不会被提升。
函数的声明
声明函数会被提前foo(); // 2 function foo () { console.log(2); } foo(); // 2
上面的代码我们可以这样看:
function foo () { console.log(2); } foo(); // 2 foo(); // 2
函数表达式不会被提前
bar(); // TypeError: bar is not a function var bar = function foo () { console.log(3) } // foo(); // ReferenceError: foo is not defined
注意:我们尝试在函数表达式之后执行 foo(),结果抛出 ReferenceError: foo is not defined,当前作用域下找不到 foo,但是在 foo函数内部可以执行,也就是自己调用自己,注意会陷入死循环。
函数局部变量提升
局部变量在局部提升,外部访问不到。
foo(); function foo () { console.log(a); // undefined var a = 1; console.log(a); // 1 }
声明同名函数
函数声明会被提前,同名函数后者会覆盖前者;
函数表达式不会被提前,同名变量声明 var foo; 提升会被忽略;
就是多个同名的变量声明,只会提升一次。
foo(); // 3 function foo () { console.log(1); } var foo = function foo () { console.log(2); } function foo () { console.log(3); } foo(); // 2
if else for等创建代码块的语句,内部声明函数
foo(); if (true) { function foo () { console.log(1); } } else { function foo() { console.log(2); } }
代码块内部函数声明是否提前不同浏览器表现不一致, IE9及以下(更高版本没试过) => 输出 2,
函数处于 if else 代码块中,预编译阶段将其全部提前,即使 else 部分不会执行。
高级浏览器(Chrome、Firefox) => 抛出 TypeError: foo is not a function
只将函数名提升,函数体并未提升。
我们将函数执行的放到if 代码块中
if (true) { foo(); function foo () { console.log(1); } } else { function foo() { console.log(2); } }
IE9以下浏览器表示一致; 高级浏览器 => 输出 1 。
低版本浏览器中,预编译阶段即使处于 if else 、for 等创建代码块的语句,会将函数声明提前。
而高级浏览器中,只会提前函数名,只有当执行到相应代码块时,才会将全部提前。
函数内部的变量、函数声明与参数
foo(1); function foo (a) { console.log(a); // function a () {// ...} var a= 2; function a() { // ... } console.log(a); // 2 }
简述执行顺序:
1.预编译阶段,foo函数声明被提前;
3.执行并传参foo(1),形参 var a = 1;
4.函数内部预编译,a函数声明被提前,var a 变量提前被忽略。
5.输出a => function a () {// …}
6.赋值a = 2;
7.输出a => 2
个人学习总结,如有不足欢迎指正。
参考博客:JavaScript提升(你不知道的JavaScript)
相关文章推荐
- 8dee 关于javascript变量声明、函数声明提升的问题
- JavaScript变量提升和函数声明预解析
- JavaScript变量声明提升和函数声明提升
- 注意javascript变量声明提升的陷阱
- JavaScript中的作用域与函数和变量声明的提升
- 变量声明提升 Vs. 函数声明提升
- 如何理解JaveScript中的函数声明提升
- 深入理解变量声明提升和函数声明提升
- 函数的提升(声明VS表达式)
- 跟我学习javascript的var预解析与函数声明提升
- javascript变量声明提升(hoisting)
- 声明提升和函数内变量声明提升
- javascript变量声明提升
- javascript中的函数声明提升
- 跟我学习javascript的var预解析与函数声明提升
- javascript变量声明提升(hoisting)
- JavaScript中变量和函数声明的提升
- 浅谈JavaScript变量声明提升
- JavaScript变量声明提升