了解Javascript范围提升(2)

了解Javascript范围提升(2)
Scoping Hoisting
var a=1;

函数(){
如果(!一){
var a=2;
}
警报(a);
};

(食品);
上面的代码运行时的结果是什么

虽然对于经验丰富的程序员来说,这只是一块蛋糕,但我仍然描述了初学者的共同想法。

1。全局变量A被创建,它定义它的值为1。

2。创建函数

三.在富函数中,if语句不会执行,因为!a将变量A转换为布尔false值,即false。

4。跳过条件分支、警报变量A,最后结果应该是输出1。

嗯,它看起来无懈可击,但令人惊讶的是,答案是2!为什么

不必担心,首先,我想告诉您,这不是错误,而是Javascript语言解释器的非官方特性。Ben Cherry称此功能为提升:目前还没有标准的翻译。

声明和定义

为了理解吊装,让我们来看一个简单的例子:

var a=1;

你有没有想过上面的代码在运行时发生了什么

你知道这两个语句中的哪一个,声明变量A和定义变量A,这个代码是正确的吗

下一个例子是所谓的报关员变量:

VaR;

下一个示例定义为变量:

var a=1;

声明:它意味着你声称某事的存在,例如变量或函数,但是你不解释它是什么,只告诉解释器这样的东西存在。

定义:它意味着你指定某个事物的具体实现,例如变量的值,函数的函数体是什么,确切地表示一个事物的意义。

总结:

var;这是一个语句

a = 1;这是定义的(赋值)

var a = 1;做一个:声明变量并赋值给它

要点是:当你认为你只做一件事(var A=1)时,解释器实际上将这个问题分解为两个步骤,一个是声明(var A),另一个是定义(A=1)。

这和吊装有什么关系

回到这个令人困惑的示例的开头,我告诉您解释器如何分析代码:
VaR;
a = 1;

函数(){
var。
如果(!一){
a = 2;
}
警报(a);全局变量a此时不在函数的体外。
}
如代码中所示,解释器在输入函数体后声明新变量a,并且不管if语句的条件如何,将对新变量赋值2,如果您不相信您可以在函数体之外发出警报(a),那么就执行富()并比较结果。

作用域(scope)

有些人可能会问:为什么不在if语句中声明变量A呢

因为Javascript没有块级范围(块作用域),唯一的功能域(功能域),所以没有看到一对大括号{ }代表受影响的新的领域,和不一样的C!

当解析器读取if语句时,它发现有一个变量声明和赋值,因此解析器将把它的声明提升到当前作用域的顶部(这是默认行为,不能更改)。这种行为叫做提升。

好吧,每个人都知道,你知道吗…

理解并不代表使用,采取的第一个例子,如果我想提醒(一)的1咋整

创建一个新范围

当警报执行时,它会在执行变量时查找变量a的位置。它从当前范围开始查找顶层范围,如果找不到它,它将在A上报告未定义。

因为在同一级别的警报(a)范围内,我们再次声明本地变量a,因此它报告2,因此我们可以将本地变量的声明向下移动(或向内),所以警报(a)找不到它。

记住:Javascript只有函数作用域!

var a=1;

函数(){
如果(!一){
(function(){ / /这是一个关于生活的谈话,它会创建一个新的功能范围
var a = 2;和(内部)的范围,因此不访问警报。
}()),但这个范围可以访问上层字段哦,这称为闭包:
};
警报(a);
};

(富);
您可能阅读了无数Javascript书籍和文章:请始终保存在范围顶部声明的所有变量。现在你应该明白为什么是这样的情况,因为它可以避免吊装特点给你带来的麻烦(我不愿意这么说,因为提升本身没有错,什么)也可以告诉所有的人很清楚阅读代码(包括你自己)在当前范围内的变量可以。但是,变量声明的推广是不是所有的提升。在Javascript,有四种方法可以让命名进入范围(优先):

1。语言命名:像这样或参数,它们在所有范围内都是有效的和最高优先级的,所以你不能在任何地方这样命名变量,所以它没有意义。

2。表单参数:当函数定义时,声明的形式参数将用作函数提升范围内的变量,因此形参是局部的,不是外部的或全局的,当然,在函数执行时可以传递外部变量,但传入后是局部的。

三.函数声明:主体中的函数也可以声明函数,但它们也是本地的函数。

4。变量声明:这个优先级实际上是最低的,但是它们也是最常用的。

另外,在讨论语句和定义之间的差异之前,还记得吗我没有说我当时为什么要理解这种差别,但现在是时候去记住了:

主机只促进命名,没有促销定义。

这与我们将要谈论的内容密切相关。

函数声明和函数表达式之间的区别

先看两个例子:
函数测试(){
(富);

函数(){
警惕(我会出现……;
}
}

测试();
函数测试(){
(富);

函数(){()
警惕(我不会发生……;
}
}

测试();
同学,了解范围提升后,你知道怎么解释吗

在第一个例子中,函数foo是一个声明,由于声明将推动(我有一个计划外的范围,因为全球范围内你的想象力,不那么直观,但道理是相同的),所以在foo()的实现在使用域函数foo的存在。这就是所谓的函数声明(函数声明),函数的声明是连接的名称和函数体提升到顶部的范围。

然而在第二个例子中,,只有通过变量foo的推动,其定义仍在的地方。因此,在执行foo(),范围只知道foo的名字,也不知道它是什么,所以执行将报告错误(通常是:定义不是一个函数)。这就是所谓的函数表达式(函数表达式),和功能的表达是唯一命名的名字是提升,和身体的功能是不确定。
尾:原来对Ben Cherry的解释比较详细,仅用英文。我知道这是比较清楚的解释,主要是给初学者听的,看更多的例子,请看原文,谢谢。

tag:提升电脑软件Javascript

相关内容