美文网首页
05 JS 声明提升

05 JS 声明提升

作者: Android_小生 | 来源:发表于2019-07-18 16:11 被阅读0次

关于编译器,引擎会在解释 JS 代码之前首先对其进行编译。编译阶段的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来。

1.声明提升

“提升”就是变量和函数声明从它们在代码中出现的位置被“移动”到了最上面,这个过程就叫“提升”。

// 代码示例 1
foo();
function foo() {
    console.log(a); // undefined
    var a = 2;
}

如上面代码示例 1, foo 函数的声明被提升了,因此第一行中的调用可以正常执行。需要注意的是,每个作用域都会进行提升操作。也就是函数自身也会在内部对 var a 进行提升,所以最终的形式可以理解为如下代码示例 2:

// 代码示例 2
function foo() {
    var a;
    console.log(a); // undefined
    a = 2;
}
foo();

2.函数表达式不会被提升

// 代码示例 3
foo(); // TypeError 类型错误

var foo = function bar() {
     // ...
}

foo() 由于对 undefined 值进行函数调用而导致非法操作,因此抛 TypeError 出异常。

3.函数优先

函数声明会被提升到普陀变量之前。

// 代码示例 4
foo(); // 1

var foo;

function foo() {
    console.log(1);
}

foo = function() {
    console.log(2);
}

上述代码示例 4 会被引擎理解为如下形式:

function foo() {
    console.log(1);
}

foo();  // 1

foo = function() {
  console.log(2);
}

重复的函数声明可以覆盖前面的

尽可能避免在块内部声明函数

总结

  • var a = 2; 其中 var a; 是编译阶段的任务,a = 2; 是执行阶段的任务;
  • 所有的声明(变量和函数)都会被“移动”到各自作用域的最顶端,这个过程叫“提升”;
  • 声明本身会被提升,而包含函数表达式在内的赋值操作不会被提升;
  • 避免重复声明。

注:文章参考总结自 《你不知道的 JavaScript 上卷》[美] KYLE SIMPSON 著 第 42 页。

相关文章

  • 05 JS 声明提升

    关于编译器,引擎会在解释 JS 代码之前首先对其进行编译。编译阶段的一部分工作就是找到所有的声明,并用合适的作用域...

  • js声明提升

    1.声明在前还是赋值在前 直觉上告诉我们js代码执行是从上而下一行一行执行的,但实际上这种思路是不完全正确的以下代...

  • js声明提升

    块级作用域块级作用域是指花括号内的每一段代码都具有各自的作用域,而javascript没有块级作用域。javasc...

  • js - 声明提升

    Js代码分为两个阶段:编译阶段和执行阶段 我们习惯将var a = 2;看作一个声明,而实际上JavaScript...

  • 变量提升和函数提升

    JS不像C语言,C语言是先声明后使用,否则会报错。但JS中,有变量提升现象,可以先使用后声明。 JS存在变量提升,...

  • 变量声明提升

    变量声明提升是JS中一个基础的问题,同时也是对JS词法作用域认识的一个提升。在JS面试题中,关于变量声明提升的问题...

  • JS变量声明提升和函数声明提升

    JS代码分为两个阶段:编译阶段和执行阶段; 编译阶段:会找到所有的声明,并用合适的作用域将它们关联起来,这是词法作...

  • js变量声明提升

    1.变量的定义 可以使用var定义变量,变量如果没有赋值,那变量的初始值为undefined 2.变量作用域 变量...

  • js变量声明提升与函数表达式

    1.变量声明提升 js引擎会把变量声明与函数声明都提升到当前函数的顶部。eg: js引擎编译为 2.函数表达式 对...

  • js面试题

    1、js 数据类型 基本数据类型 引用数据类型 2、js 变量和函数声明的提升 在js中变量和函数的声明会提升到最...

网友评论

      本文标题:05 JS 声明提升

      本文链接:https://www.haomeiwen.com/subject/nfuzkctx.html