摘要:函数声明被提升时,声明和赋值两个步骤都会被提升,而普通变量却只能提升声明步骤,而不能提升赋值步骤。变量被提升过后,先对提升上来的所有对象统一执行一遍声明步骤,然后再对变量执行一次赋值步骤。
专栏刚刚开通, 先把自己以前写的一些没人看的答案搬运过来填补一下空白.
变量的问题,莫过于声明和赋值两个步骤,而这两个步骤是分开的。
函数声明被提升时,声明和赋值两个步骤都会被提升,
而普通变量却只能提升声明步骤,而不能提升赋值步骤。
变量被提升过后,先对提升上来的所有对象统一执行一遍声明步骤,
然后再对变量执行一次赋值步骤。
而执行赋值步骤时,会优先执行函数变量的赋值步骤,再执行普通变量的赋值步骤。
当你明白这三点后,一切都豁然开朗了。
首先来看一个DEMO:
(function(){ function a(){}; var a; alert(typeof a); //function })();
先提升两个a,然后执行函数的赋值步骤,a没有被赋值,故结果为function
再看一个:
(function(){ alert(typeof a);//function function a(){}; var a = 1; })();
先提升两个a,再执行函数的赋值步骤,
因为在alert语句执行以前,还未执行a = 1的赋值步骤,函数不会被覆盖,故为function
来个最有说服力的:
(function(){ var a = 1; function a(){}; alert(typeof a); //number })();
在alert语句执行之前,a = 1步骤和函数赋值步骤均已执行,
而且函数还在a = 1赋值语句之后,但是仍然输出number,
就是因为函数的赋值步骤会先于a = 1的赋值步骤,函数被覆盖,故输出number。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/80691.html
摘要:换句话说,在代码执行之前,会对作用域链中所有变量和函数声明先处理完先。总结一句话就是只有声明被提升,而赋值或其他运算会留在原地。为其声明变量隐性劫持到所在区域中。 之前一直觉会认为javascript代码执行是由上到下一行行执行的。自从看了《你不知道的JS》后发现这个观点并不完全正确。先来给大家举一个书本上的的例子: var a=hello world; var a; co...
摘要:事实上,实现元编程有多种方式,从语言本身来讲,可以分为两类增强型与新的语法实现,前者的代表是反射,后者的代表为。在第二部分,我们尝试在语言基础上增加原生的元编程能力并介绍了该思路的实现框架。 语言的自由度 自由度这个概念在不同领域有不同的定义,我们借鉴数学中构成一个空间的维数来表达其自由度的做法,在此指的是:解决同一个问题彼此不相关的设计方法学数量。 例如,解决一个比如商品打折的问题,...
摘要:事实上,实现元编程有多种方式,从语言本身来讲,可以分为两类增强型与新的语法实现,前者的代表是反射,后者的代表为。在第二部分,我们尝试在语言基础上增加原生的元编程能力并介绍了该思路的实现框架。 语言的自由度 自由度这个概念在不同领域有不同的定义,我们借鉴数学中构成一个空间的维数来表达其自由度的做法,在此指的是:解决同一个问题彼此不相关的设计方法学数量。 例如,解决一个比如商品打折的问题,...
摘要:但是碰到声明提升,这种想法就会被打破。声明一个函数进行相应的操作,会得到函数声明提升的结果。由此可以发现变量和函数的声明都会被提升在其他代码的前面执行。一个普通块内部的函数声明通常会被提升到所在的作用域的顶部。的创建初始化和赋值均会被提升。 Javascript声明提升 在分析声明提升之前,我认为有必要知道的两点: 一、引擎查询变量的两种方式 引擎查询变量的方式可以分为LHS和RHS两...
阅读 1243·2019-08-30 12:49
阅读 3049·2019-08-28 18:14
阅读 800·2019-08-26 11:38
阅读 1649·2019-08-23 18:23
阅读 2803·2019-08-23 17:04
阅读 471·2019-08-23 16:52
阅读 3969·2019-08-23 16:43
阅读 2739·2019-08-23 16:12