JavaScript声明提升

JavaScript声明提升

声明提升就好像把声明(变量声明和函数声明)从它们所在代码中出现的位置移到了最上面。直觉上我们会以为JavaScript代码是由上到下一行一行执行的,但实际上这并不完全正确,还要考虑声明提升的存在。

1题目12var a = 99; // 全局变量a 3f(); // f是函数,虽然定义在调用的后面,但是函数声明会提升到作用域的顶部。 4console.log(a); // a=>99, 此时是全局变量的a 5function f() { 6 console.log(a); // 当前的a变量是下面变量a声明提升后,默认值undefined 7 var a = 10; 8 console.log(a); // a => 10 9} 10 11// 输出结果: 12undefined 1310 1499

在实际开发中,很多程序员把a=0写成var a=0;但实际上它们差别很大 我们习惯性的 把var a = 2; 看做一个声明,而实际上JavaScript引擎并不这么认为。它将 var a 和 a = 2 当做两个单独的声明, 第一个是编译阶段的任务,而第二个则是执行阶段的任务。只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。

1var a; 2a = 2; 3console.log(a); // 2 4 5 6var a; 7console.log(a); // undefined 8a = 2;

声明提升实例:

1fn(); 2/** 3* 4*/ 5function fn(){ 6 console.log(a); // ?? 7 var a = 2; 8} 9/** 10*等同于上面 11*/ 12function fn2(){ 13 var a; 14 console.log(a); // undefined 15 a = 2; 16}

function方法的声明也一样 函数声明会被提升,但是函数表达式却不会被提升。

1fn(); 2var fn = function (){ 3 console.log(a); 4 var a = 2; 5} 6// Uncaught TypeError: fn is not a function

函数声明和变量声明都会被提升,但是函数会首先提升,然后才是变量。即函数声明的优先级要大于变量声明。

声明提升优先级:

1var yfun; 2yfun(); // ?? 3function yfun(){ 4 console.log(1); 5}

按照声明提升的思路(相当于把所有声明提升的部分移到代码的最上面然后在一行一行顺序执行),上面的两段代码相当于:

1function yfun(){ 2 console.log(1); 3} 4var yfun; // 重复声明,被忽略 5yfun(); // 1

尽管var yfun出现在function yfun之前,但是函数提升的优先级要大于变量提升,所以 function yfun(){} 会在var yfun之前;但是var yfun是重复声明所以被忽略了,所以最终输出1。

在网上看到的一个函数声明的例子

1var foo; 2 3foo(); // 3 4 5function foo(){ 6 console.log(1); 7} 8 9function foo(){ 10 console.log(3); 11} 12 13foo = function(){ 14 console.log(2); 15}

这个函数初始化运行时输出3,而如果页面内调用则会输出2, 原因就是函数提升

现在不少编辑器,如果直接运行js而不是浏览器环境,声明提升代码运行结果可能会报错函数或者变量不存在

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

JavaScript - 关于 var、let、const 的区别使用

一、var在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量注意:顶层对象,在浏览器环境指的是window对象,在Node指的是global对象var a  10;console.log(window.a) // 10使用var声明的变量存在变量提升的情况console.log(a) // undefine

《前端实战总结》之变量提升,函数声明提升及变量作用域详解

之所以会写这篇文章,主要源于笔者在重构老项目的时候发现了一个bug,导致某个插件不生效了,在review加searchcode加断点调试之后,发现了原因:一个同名的变量将插件方法给覆盖了,ohmyGad。正文1.变量是如何被覆盖的在一般情况下,js代码都是自上而下执行的,对于同一个变量,我们可以通过如下方式来修改:jsvara1;

Javascript中的变量提升

定义JavaScript中奇怪的一点是你可以在变量和函数声明之前使用它们。就好像是变量声明和函数声明被提升了代码的顶部一样。sayHi()//Hithere!functionsayHi()console.log('Hithere!')name'JohnDoe'console.log(name)//JohnDoevarn