JavaScript 变量提升,函数提升

  • 对于变量声明来说,若有重复声明,后续的重复声明会被优化忽略

  • 对于函数声明来说,后定义的函数声明会覆盖先前的函数声明

例子 ①

===================================================================

test();

function test(){

console.log(a);

var a = 100;

}

// 实际顺序是

function test(){

var a;

console.log(a);

a = 100;

}

test();

说明:

  • 函数声明test()被提升了,提到了其作用域的最前面。

  • 变量声明a也被提升了,提到函数体内的最前面,所以输出的是undefined,不会报错,也不会输出100。

  • a = 100 赋值语句并没有被提升,而是待在原地不动。

这个例子可以佐证上面的规则:

  • 提升的仅仅是变量或函数的声明部分,赋值语句待在原地不动

  • 若被提升,会提到其作用域的最顶上去。test函数声明提到了全局最前面;变量a声明提到了函数体内的最前面。

例子 ②

===================================================================

console.log(num);

var num = 100; // ***

function test(){

console.log(num);

var num = 200;

console.log(num);

}

test();

console.log(num);

实际执行是怎么样呢?按上面规则操作一下:

// 函数声明会被提升到作用域最前面,而且优先级高于变量声明提升

function test(){

var num; //变量声明提升到作用域最前面

console.log(num); // ②

num = 200; // 赋值语句不被提升,原地不动

console.log(num); // ③

}

var num; //标记 *** 的变量声明被提升

console.log(num); // ①

num = 100; // 赋值原地不动

test();

console.log(num); // ④

在这里可以看到,佐证三点主要规则有:

  • 被提升的仅仅是函数或变量的声明部分,赋值语句等原地不动。

  • 被提升,则提升至其作用域的最顶去

  • 函数声明提升优先级高于变量声明提升。

那么输出结果呢

// 按顺序执行 …

// var num; 声明num

// 执行console.log(num) ①; num未赋值,为undefined

// num = 100;

// 执行函数test();

// console.log(num) ②; 作用域内num未赋值,为undefined

// num = 200;

// console.log(num) ③; 输出200

// console.log(num) ④; 输出100

这里需要注意一下,JavaScript的作用域及作用域链。

例子 ③

===================================================================

这个例子用于诠释:函数表达式不会被提升。

test();

var test = function(){

console.log(‘test’);

}

实际是:

var test;

test(); // 报错

test = function(){

console.log(‘test’);

}

变量test提升

但是表达式

test = function(){

console.log(‘test’);

}

是不会提升的。

例子 ④

===================================================================

这个例子主要诠释关于重复声明的注意点

一、先是变量重复声明 —— 后续声明会被忽略掉,如:

test();

var test;

function test(){

console.log(‘1’);

}

var test = function(){

console.log(‘2’);

}

实际上是:

function test(){

console.log(‘1’);

}

var test; // 重复声明

var test; // 重复声明

test(); // 输出1

// 函数表达式不提升

test = function(){

console.log(‘2’);

}

二、函数的重复声明 —— 后续声明覆盖前者,如:

test();

function test(){

console.log(‘1’);

}

var test = function(){

console.log(‘2’);

}

function test(){

console.log(‘3’);

}

实际上是:

// 函数声明优先提升

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
存中…(img-WF0ekYQ6-1715464929683)]

[外链图片转存中…(img-3dV9kOLV-1715464929684)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 JavaScript 变量提升指的是在代码执行前,变量声明就已经被提升(即复制)到了当前作用域的最顶端。这意味着,无论变量在代码定义在哪里,它都在代码执行前被提升到所在作用域的最顶端。 例如: ``` console.log(a); // undefined var a = 1; ``` 在这个例子,虽然变量 `a` 实际上定义在了第二行,但是在代码执行前,它已经被提升到了最顶端。所以在第一行,当我们尝试访问 `a` 时,它已经被声明过了,所以输出 `undefined`。 注意,变量提升仅仅是声明(复制)被提升,而不是赋值。所以在上面的例子变量 `a` 的值在第二行被赋值为 1,而不是在第一行被赋值为 `undefined`。 ### 回答2: JavaScript变量提升JavaScript的一种特性。在JavaScript变量声明在代码执行之前进行处理,也就是说它们被“提升”到其作用域的顶部。这意味着你可以在声明之前使用变量,而不引发错误。 例如,假设我们有以下的JavaScript代码: ``` console.log(x); // undefined var x = 5; console.log(x); // 5 ``` 在这个例子变量x被提升到了代码的顶部,所以在第一个console.log语句,x被声明了但尚未被赋值,所以它的值是undefined。然后,变量x被赋值为5,并在第二个console.log语句打印出来。 需要注意的是,只有变量声明提升,而不是它们的赋值。例如: ``` console.log(y); // ReferenceError: y is not defined y = 10; console.log(y); // 10 var y; ``` 在这个例子变量y在它的声明之前被使用引发错误。只有在变量y的声明后,它的赋值才生效。 变量提升在理解JavaScript的作用域和执行顺序时非常重要。它使得我们可以在变量声明之前使用变量,但也可能导致一些意外的结果,所以在编写代码时要小心使用。 ### 回答3: JavaScript变量提升是指在代码执行之前,所有变量声明提升到代码的顶部。这意味着我们可以在变量声明之前使用这些变量。但是要记住的是,只有变量声明提升,而不是初始化。 例如,我们可以在变量声明之前输出变量的值: console.log(x); // undefined var x = 5; 这段代码变量x在声明之前被赋值为undefined,因此在打印x时,它的值是undefined。 变量提升还可以应用于函数声明。我们可以在函数声明之前调用函数: myFunction(); // "Hello, World!" function myFunction() { console.log("Hello, World!"); } 在这个例子函数myFunction在声明之前被调用,所以我们可以在调用函数之前定义它。 需要注意的是,变量提升仅适用于使用var关键字声明变量,而不适用于使用let和const关键字声明变量。使用let和const声明变量是块级作用域的,不提升。 综上所述,JavaScript变量提升是一种将变量声明提升到代码顶部的机制,使我们可以在变量声明之前使用这些变量。这在代码书写和阅读上提供了一定的便利,但也需要注意一些细节,以避免出现意料之外的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值