当前位置:首页 > 日记 > 正文

了解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的解释比较详细,仅用英文。我知道这是比较清楚的解释,主要是给初学者听的,看更多的例子,请看原文,谢谢。

相关文章

WPS演示如何制作闪烁星WPS演示教程

WPS演示如何制作闪烁星WPS演示教程

教程,闪烁,演示,电脑软件,WPS,看来别人的事是好的。找到别人制作的幻灯片非常感人。有些效果不错。这是值得学习的,它一直吸引着我的效果,它是一个闪烁的文字,这个效果真的很好,有很多好处,但并不难实现。下面是一个介绍如何制作闪烁星星的介绍…

最流行的搞笑签名文件搞笑个性签名

最流行的搞笑签名文件搞笑个性签名

签名文件,搞笑,最流行,个性签名,电脑软件,每个人都有自己的签名。你必须绞尽脑汁才能使你的签名与众不同。现在没有必要纠结了。这里有一些最新的搞笑签名文件经萧边推荐。你见过他们吗 1、每次做数学题先写清楚的解决办法,然后用抓纸的方法…

对Excel公式的提示#零误差值!如何做

对Excel公式的提示#零误差值!如何做

提示,误差,如何做,公式,电脑软件,如今,电脑的使用越来越普及。许多人需要在工作或生活中使用Excel办公软件,但一些小知识,如Excel公式错误值提示#空!如何做萧边在这里给您详细的解答。 Excel可以使我们的工作更容易,但朋友们经常要遇到一些错误…

excel如何按顺序排列excel基

excel如何按顺序排列excel基

顺序排列,电脑软件,excel,当我们报告统计或数据时,我们都希望我们能按excel排列数据,这样无论我们分类或预览,都是非常清楚和清楚的,尤其是当excel数据混乱时,我们可以按顺序排列excel表。它们可以按时间顺序排列,也可以按数字或字母排列。本教程…

如何实现PDF和PPT转换PPT基础教程

如何实现PDF和PPT转换PPT基础教程

转换,如何实现,基础教程,电脑软件,PPT,如今,电脑的使用越来越普及。很多人需要使用PPT办公软件来工作或生活,但是一些小的知识,比如如何实现PDF和PPT的转换,是这里详细回答的。 PDF文件经常出现在我们的工作中,有时我们需要做一个很好的PPT来转…

论七夕情人节情感签名的感性签名

论七夕情人节情感签名的感性签名

情人节,感性,情感,电脑软件,论七夕,1、原来一个人的寂寞并不寂寞,思念一个早已离去的人,真的很寂寞。 2、情人节,我要走在路上,让那对恋人看着我的骄傲。 三.情人节谁能陪我 在4和第七前夕,只有牛郎织女的节日与少女,这无关与俄罗斯的凡人。 5、…

对于CorelDRAW的一些选项编辑段落

对于CorelDRAW的一些选项编辑段落

文本,选项,段落,编辑,电脑软件,本教程介绍coreldraw编辑段落文本的一些选项。本教程更实用。非常适合初学者学习。 方法本教程的朋友coreldraw编辑文本选项的某些段落,教程介绍的比较详细,方法很实用,很多选择艺术体文本编辑适用于段落文本的…

非主流人格签名推荐感性人格签名

非主流人格签名推荐感性人格签名

推荐,人格,感性,非主流,电脑软件,Ldquo;又一次繁华的微笑,依然无法承受专属的寂寞。为你的QQ选择个性签名。 1,你是我幸福的回忆,我是你忘记的过去。 2,据说你太爱一个人,而那个人不会爱你。 3,我的幸福就是你在的时候,你失去了,没有人会知道我总是…

对CorelDRAW制作混合协调法

对CorelDRAW制作混合协调法

协调,混合,电脑软件,CorelDRAW,本教程介绍朋友如何在CorelDRAW使混合谐波效应。本教程是比较基础的,非常适合初学者学习。建议,不,朋友们可以一起学习教程。 今天,我介绍我的朋友制作混合方式(协调)的影响在CorelDraw。本教程中介绍的方法非常实…

放下,不要在QQ空间这样的QQ空间

放下,不要在QQ空间这样的QQ空间

空间,不要在,电脑软件,QQ,如果你爱,生活是可爱的。 如果你憎恨,生活会被憎恨。 如果你心存感激,你可以心存感激;如果你长大了,你就能成长。 不是世界选择了你,而是你选择了世界。 既然无处藏身,就无所谓;既然没有逃避,就如同欢乐; 因为没有净土,最好是…

用过滤网制作漂亮的菊花菊花过滤区

用过滤网制作漂亮的菊花菊花过滤区

过滤,滤网,用过,漂亮,电脑软件,本教程的效果有点类似烟花的制作,但在使用极坐标滤波器时,角度的变化是不同的,只是为了做成花的形状。然后用当地的花瓣做雄蕊,颜色可以选择。 最终效果 1。一种新的800×800像素文档,分辨率为150像素/英寸。背…

学习Javascript的这个关键字与我

学习Javascript的这个关键字与我

关键字,学习,与我,电脑软件,Javascript,本文仅讨论这个问题。如果我们能正确地回答Javascript中的这个问题,作为一个作者,我会觉得写这样的文章是值得的。 让我们记住一个词:它总是指向函数运行的对象,它不是创建函数时创建的对象,也就是说,谁调用,指向…