资讯专栏INFORMATION COLUMN

javascript变量提升和函数提升

sf190404 / 3294人阅读

摘要:注意的是,在语法中新增的声明方式,并不支持这种变量提升强行使用会抛出错误函数提升对于函数提升,只用函数的声明被提升,表达式则不会被提升函数声明函数表达式表达式定义的函数,称为匿名函数。匿名函数没有函数提升。


变量提升

Variable hoisting变量提升是js比较有特点的地方,它允许你先使用变量,在其后面再进行变量声明,不会抛出 Uncaught ReferenceError异常。虽然变量被提升到前面,但是它的默认值则是undefind,在引用的时候也使用这个值,知道在其面后进行赋值,在使用时候即为所赎的值。

举个例子:

console.log(x)
//如果后面不定义x 则抛出"ReferenceError: x is not defined
//如果后面对x定义 则打印出undefined
var x = 2


var abc = "abcd";

(function(){
    console.log(abc); //undefined
   var abc = "1234";
  console.log(abc); //"1234"
})()

//上面代码可以这样翻译

var x;
console.log(x)//undefined
var x = 2

var abc = "abcd";

(function(){
  var abc;
  console.log(abc); //undefined
  var abc = "1234";
  console.log(abc); //"1234"
})()

基于这个原因,在平时编写代码时候,尽量把变量声明放到代码块最顶层位置,可以使代码结构清晰。
注意的是,在ES6语法中新增的let or const 声明方式,并不支持这种变量提升,强行使用会抛出错误ReferenceError

函数提升

对于函数提升,只用函数的声明被提升,表达式则不会被提升

/* 函数声明 */

foo(); // "bar"

function foo() {
  console.log("bar");
}
/* 函数表达式   表达式定义的函数,称为匿名函数。匿名函数没有函数提升。*/

baz(); // TypeError: baz is not a function
//此时的"baz"相当于一个声明的变量,类型为undefined。
由于baz只是相当于一个变量,因此浏览器认为"baz()"不是一个函数。
var baz = function() {
  console.log("bar2");
};

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/50977.html

相关文章

  • javascript声明提升

    摘要:但是碰到声明提升,这种想法就会被打破。声明一个函数进行相应的操作,会得到函数声明提升的结果。由此可以发现变量和函数的声明都会被提升在其他代码的前面执行。一个普通块内部的函数声明通常会被提升到所在的作用域的顶部。的创建初始化和赋值均会被提升。 Javascript声明提升 在分析声明提升之前,我认为有必要知道的两点: 一、引擎查询变量的两种方式 引擎查询变量的方式可以分为LHS和RHS两...

    evin2016 评论0 收藏0
  • 【6】JavaScript 函数高级——执行上下文与执行上下文栈、变量提升(图解+典型实例分析)

    摘要:函数和变量相比,会被优先提升。这意味着函数会被提升到更靠前的位置。仅提升声明,而不提升初始化。 JavaScript 函数高级——执行上下文与执行上下文栈(图解+典型实例分析) 变量提升与函数提升 变量声明提升 通过 var 定义(声明)的变量,在定义语句之前就可以访问到 值:undefined /* 面试题 : 输出 undefined */ var a = 3 ...

    niuxiaowei111 评论0 收藏0
  • 译: 函数提升提升面试的相关问题

    摘要:函数提升在里有两种方式创建函数,通过函数声明和函数表达式。函数声明用指定的参数来定义函数。提示不要在中进行函数声明。问题输出两个都是用函数声明的函数,将被提升到的局部作用域顶端。函数本身将作为函数声明在全局范围内提升。 作者关于提升的话题,总共有两篇。(后来又有一个讨论篇),再次搬过来。水平有限,如果翻译的不准确请包涵,并去看原文。下面开始: 这是我之前的关于提升的文章,标题为《用le...

    wuaiqiu 评论0 收藏0
  • JavaScript 变量声明提升

    摘要:输出的结果为输出的结果为提升后输出的结果为重新定义了变量输出的结果为如果定义了相同的函数变量声明,后定义的声明会覆盖掉先前的声明,看如下代码输出练习的值是多少的值是多少第二题的解析请看这里参考资料文章文章中文版链接文章推荐文章变量提升 JavaScript 变量声明提升 原文链接 一个小例子 先来看个例子: console.log(a); // undefined var a =...

    fireflow 评论0 收藏0
  • ES6 变量作用域与提升变量的生命周期详解

    摘要:不同的是函数体并不会再被提升至函数作用域头部,而仅会被提升到块级作用域头部避免全局变量在计算机编程中,全局变量指的是在所有作用域中都能访问的变量。 ES6 变量作用域与提升:变量的生命周期详解从属于笔者的现代 JavaScript 开发:语法基础与实践技巧系列文章。本文详细讨论了 JavaScript 中作用域、执行上下文、不同作用域下变量提升与函数提升的表现、顶层对象以及如何避免创建...

    lmxdawn 评论0 收藏0
  • 浅析JavaScript中的提升

    摘要:代码在执行时并不完全是由上到下一行一行执行的,由此产生了一个提升的问题。第二个赋值声明会被留在原地等待执行阶段。可以得知函数声明提升的优先权大于普通变量声明。 JavaScript代码在执行时并不完全是由上到下一行一行执行的,由此产生了一个提升的问题。 什么是提升 可以简单理解为:声明(变量和函数)都会被移动到各自作用域的最顶端,这个过程被称为提升。 具体例子看提升 下面两个例子a会l...

    everfly 评论0 收藏0

发表评论

0条评论

sf190404

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<