深入理解Javascript中的提升机制

深入理解Javascript中的提升机制
起升机构

Javascript的变量声明具有提升机制。当Javascript引擎执行时,所有变量声明都被提升到当前范围的最前面。

先看一段代码
var;
函数(){())
console.log(V);
var;
});
此代码运行的结果是什么

答案是:未定义

代码的这一部分说明了两个问题。

首先,函数范围中的变量V覆盖了上层变量V,代码中很少有变化。
var;
如果(真){
console.log(V);
var;
}
输出结果是hello,表示Javascript不是块级别。

第二,在函数作用域中,增加了变量v的声明,使原代码等价于:
var;
(函数(){())
var;
console.log(V);
世界;
});
声明、定义和初始化

声明要求存在一个名称,该名称被定义为该名称的存储空间的分配,而初始化是名称分配的存储空间的初始值。

使用C++来表达三个概念

extern int i; / /这是一个声明,这个名字我已经存在的地方。

这是名称i的声明和定义,我分配存储空间。

I=0;这是名称i的初始化,它的初始值是0

Javascript中的情况就是这样。

var

vhello;(定义和初始化变量)V

由于Javascript是一种动态语言,它的变量没有固定的类型,它的存储空间会随着初始化和赋值而改变,所以它的变量的定义与传统的静态语言不一样。它的定义微不足道。

申报晋升

在当前作用域中的声明被提升到作用域的前面,包括变量和函数的声明。
(函数(){())
var1;
Var(f =函数){ };
var2;
var3;
});

变量a、f、b和c的声明将被提升到函数作用域的前面,如下所示:
(函数(){())
var,f,b,c;
a1;
f =函数(){ };
2;
3;
});
请注意,函数表达式没有被提升,这是函数表达式和函数声明之间的区别
(函数(){())
f1,函数F2(提升){;隐式提升语句

F1(); / / referenceerror:F1没有定义
(F2);

Var(f1 =函数){ };
函数(F2){ }
});

上面代码中的函数声明F2被提升,所以调用F2在前面是没有问题的。

名称解析顺序

Javascript中的名称(名称)以四种方式进入范围(范围),其优先级顺序如下:

1、语言内置:所有域都有这个和参数关键字

2。形式参数:函数的参数在函数范围内是有效的。

3,函数声明表单函数:(){ }

4、变量声明:如var条;

上面显示了名称声明的优先级。也就是说,如果变量的名称与函数的名称相同,则函数的名称将覆盖变量的名称,不管代码中的顺序是什么,但是名称的初始化是按照代码中的顺序执行的,而不受上述优先级的影响
(函数(){())
变量Foo;
console.log(类Foo); / /功能

函数(富){ }


console.log(类Foo); / /串
});

如果形参中有多个名称空间变量,则最后一个同名参数将覆盖其他同名参数,即使最后一个参数未定义。

上述名称解析优先权有例外,例如可以在语言中重写的名称参数。

命名函数表达式

可以像函数声明那样为函数表达式指定一个名称,但这并不能使函数表达式成为函数声明。命名函数表达式的名称不进入名称空间,也不会被提升。

f(); / /列表F是一个函数

foo(); / / referenceerror:Foo没有定义

var =函数foo(){ console.log(类Foo);};

f();函数

foo(); / / referenceerror:Foo没有定义

命名函数表达式的名称仅在函数作用域中有效。

请看下面的示例。
无功myval =我的全局变量;
(函数(){())
console.log(myval); / /日志我的全局变量
});

很明显,上面的代码将输出我的全局var
无功myval =我的全局变量;
(函数(){())
console.log(myval); / /日志定义
无功myval =我的局部变量;
});

执行结果是一个未定义的输出,而这个结果的原因是提升了变量的声明,上面的代码与下面的相同:
无功myval =我的全局变量;
(函数(){())
无功myval;
console.log(myval); / /日志定义
myval =我的局部变量;
});

提升仅仅是变量的声明部分,并且它不会立即初始化,因此将输出未定义的部分。

然而,这种机制不仅表现在普通变量中,而且也体现在函数中:
(函数(){())
有趣的(TypeError); / /捕获的定义不是一个函数
var =函数(){()
console.log(你好!;
}
});

因为它相当于:
(函数(){())
VaR的乐趣;
有趣的(TypeError); / /捕获的定义不是一个函数
乐趣=函数(){
console.log(你好!;
}
});

因为函数的声明也在没有立即初始化的情况下被提倡,它将出错。

当然,定义函数的方法称为函数表达式。将有一个升降机构。如果是下面的函数声明方式,就没有改进机制。
(函数(){())
(有趣);
功能乐趣(){
console.log(你好!)!
}
});

这也是函数语句和函数表达式之间的主要区别。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部