当前位置:网站首页>JS 函数提升和var变量的声明提升
JS 函数提升和var变量的声明提升
2022-07-06 09:17:00 【阿波次嘚】
变量提升
//第1题 ~~
var a = 1;
function bar() {
console.log(a);
if (!a) {
var a= 10;
}
console.log(a);
}
bar();
//问:两次console.log()的值是什么。
**//输出:**
undefined
10
//解析:
全局变量有个a,但是函数内部也有个a 所以全局变量a 在函数内部无效,因为var 声明的变量没有块级作用域概念 所以if里的 a 提升到了函数内部的最顶端 而且只提升声明部分 不提升赋值部分 所以第一个console 输出了函数内部提升的a 但是此时没有赋值 JS会给生命的变量赋初始值undefined
第二个 console 看if条件 !a 此时a是undefined 为 false 那么!a就是true
会进入if作用域里 给a赋值 那么第二个 console 输出 10.
要清楚几个概念
var 有函数作用域 但是没有块级作用域
块级作用域: 包括循环语句循环体;分支语句的大括号;或者只有一对大括号。
如:
//(1)
if(true){
var a = 1;
}
//(2)
for(var i=0;i<10;i++){
var a = 1;
}
//(3)
{
var a = 1;
}
以上的情况都会使var 声明的变量提升。
//第2题 ~~
function fun5(a, b) {
var a;
var b;
console.log(a, b);
}
fun5(1, 2);
~~输出
1 2
//解析:
这里声明的a,b 其实是程序自动给我们声明的 也就是说形参变量和我们在函数内部声明并且不赋值的变量是一个变量(前提是变量名称要相同)
形参变量不写声明 js也会帮我们隐式声明 人为的手动声明其实可有可无,主要是在迷惑我们…
//第3题 ~~
function fun() {
var n1 = n2 = n3 = 1;
}
fun();
console.log(n2, n3);
//输出:
1 1
//解析:
这里需要注意:
(1)在函数内部不用var关键字声明的变量会被视为全局变量,所以n2 n3 是 全局变量。
var 后面紧挨着的n1 才是声明的局部变量。
(2)赋值运算符执行顺序
n3 = 1; // n3 是 1
n2 = n3; // n2 是 1
var n1 = n2; // 因为n1是局部变量所以在外部调用会显示未定义。
函数提升
c();
var c=2;
function c(){
console.log(5);
}
c();
答案:
函数提升:程序执行前,会将函数整体提升到所在作用域的最前边,可以先调用再创建。
所以:第一行的c() 是可以调用到 函数c的。
注意:变量名和函数名相同,因为函数名称 本质是就是一个变量,保存了函数。所以函数c可以写成
var c = function(){
console.log(5);
}
//那么下一句 就是
var c = 2;
//此时c是2,不再是方法了。所以显示函数未定义。
a();
function a() {
console.log(111);
}
a();
function a() {
console.log(222);
}
a = function () {
console.log(333); }
a();
结果是:222 222 333
说明:函数表达式 不会提升! 因为等号是赋值 不是声明
~~function 开头的才会提升
a = function () {
console.log(333); }
a();
function a() {
console.log(222);
}
a();

function a() 提升到了最前面 函数表达式不提升 然后被a=function()覆盖了
var a = 5;
function a() {
console.log(111);
}
console.log('a :>> ', a);

相当于
边栏推荐
- XML file explanation: what is XML, XML configuration file, XML data file, XML file parsing tutorial
- Encodermappreduce notes
- RT-Thread API参考手册
- Pytorch实现简单线性回归Demo
- Pytoch implements simple linear regression demo
- Oppo vooc fast charging circuit and protocol
- Arduino gets the length of the array
- [esp32 learning-2] esp32 address mapping
- 【ESP32学习-2】esp32地址映射
- MP3mini播放模块arduino<DFRobotDFPlayerMini.h>函数详解
猜你喜欢

C语言回调函数【C语言】

5G工作原理详解(解释&图解)

Reno7 60W super flash charging architecture

Amba, ahb, APB, Axi Understanding

RT-Thread API参考手册

Vert. x: A simple login access demo (simple use of router)

open-mmlab labelImg mmdetection

高通&MTK&麒麟 手機平臺USB3.0方案對比

Feature of sklearn_ extraction. text. CountVectorizer / TfidVectorizer

Programmers can make mistakes. Basic pointers and arrays of C language
随机推荐
Variable star user module
Implementation scheme of distributed transaction
Kaggle竞赛-Two Sigma Connect: Rental Listing Inquiries
Kconfig Kbuild
Hutool中那些常用的工具类和方法
Basic use of pytest
Selective sorting and bubble sorting [C language]
Dead loop in FreeRTOS task function
ESP8266通过Arduino IDE连接Onenet云平台(MQTT)
5G工作原理详解(解释&图解)
I2C总线时序详解
【ESP32学习-1】Arduino ESP32开发环境搭建
MySQL START SLAVE Syntax
RuntimeError: cuDNN error: CUDNN_ STATUS_ NOT_ INITIALIZED
RT thread API reference manual
E-commerce data analysis -- User Behavior Analysis
arduino获取随机数
树莓派 轻触开关 按键使用
ARM PC=PC+8 最便于理解的阐述
mysql实现读写分离