变量声明前置与函数声明前置

变量声明前置

变量声明出现在代码中的任何位置都会在该代码执行前处理,这意味着变量可以在声明之前使用。这个行为叫"hoisting",即把在指定作用域内声明的变量提升到函数或全局代码的顶部。
声明变量的作用域限制在其声明位置的上下文中,而未声明变量总是全局的,所以总在作用域最开始声明变量可以使变量的作用域变得清晰。

示例:

console.log(a);  //undefined
var a=1;
console.log(b);  //ReferenceError:b is not defined
  • 由上到下执行代码之前,解析器会先找关键字var,找到了var a,就提升var a并将a初始化为undefined
  • 再由上往下执行,读到consolo.log(a),控制台打印出来的就是undefined
  • 接着给变量a赋值为1,如果这个时候后面再加一句consolo.log(a),那么控制台就会多打印出一个1
  • console.log(b)的结果很好理解,因为没有声明变量b所以抛出错误

也就是说变量声明会在代码执行之前就创建、初始化并赋值undefined

注意:
提升的是var a而不是var a=1,var a=1是后面赋的值。
这也印证了:变量声明会提升,变量的赋值不会提升!!!

函数声明前置

使用function关键字可以声明一个函数,它的特征是函数声明提升,执行代码前会先读取函数声明,即函数声明不必放在调用的前面,它可以放在当前作用域的任何位置。
示例:

a();
function a(){
console.log("hello world")
};

以上代码结果如下:没有return语句就会有undefined。

js引擎有以下过程:

  • 找到所有用function声明的变量,在环境中创建这些变量
  • 将这些变量初始化并赋值为function(){console.log("hello world")}
  • 开始执行代码a()

也就是说function声明会在代码执行之前就创建、初始化、赋值


注意:变量声明和函数声明都会提升,函数声明提升的优先级高于变量声明提升。
示例:

console.log(a);
var a=1;
function a(){};

推荐阅读
我用了两个月的时间才理解 let

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前端07班 王语句JavaScript程序的执行单位为行(line),也就是一行一行地执行。一般情况下,每一行就是...
    ea203453e188阅读 4,429评论 0 4
  • 函数声明和函数表达式有什么区别 (*)解析器会率先读取函数声明,并使其在执行任何代码之前可以访问;函数表达式则必须...
    coolheadedY阅读 3,008评论 0 1
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,388评论 2 17
  • 1.函数声明和函数表达式有什么区别 (*) 区别: 函数声明后面的分号可加可不加,不加也不影响接下来语句的执行,但...
    Sheldon_Yee阅读 3,101评论 0 1
  • 2045年四月的一天。那日阳光明媚艳丽,照的人懒洋洋的。路边杂花生树,正所谓人间四月芳菲尽,山寺桃花始盛开。转过一...
    小葵爱书阅读 1,697评论 0 1

友情链接更多精彩内容