博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前端细节大全(一):javascript中的变量提升问题
阅读量:3916 次
发布时间:2019-05-23

本文共 1063 字,大约阅读时间需要 3 分钟。

 

一、问题的发现

    很多小伙伴在前端作业的js部分中往往会遇到一些问题就是明明我给变量赋值了,为什么之后在函数调用的时候输出变量是undefined。小编也是觉得很奇怪,接下来看看小编的理解。

二、解释

   我们先看如下图:

//定义全局变量    var scope="全局变量";	function test(){		document.writeln(scope + "
"); //定义局部变量,作用于函数内部 var scope="局部变量"; //再次输出scope值 document.writeln(scope + "
"); } test();//调用函数

结果:

                                                           

 我们会发现,显示出undefined,而第二个局部变量却能够很好的输出。这是为什么呢?细心的小伙伴已经发现,我们申明scope的时候是在函数外部进行声明,但是在函数内部声明另一个scope的时候出现变量提升,也就是函数内部的scope声明语句会提升到函数头部进行声明,此时就相当于scope下面这个函数。 我们会发现,显示出undefined,而第二个局部变量却能够很好的输出。这是为什么呢?细心的小伙伴已经发现,我们申明scope的时候是在函数外部进行声明,但是在函数内部声明另一个scope的时候出现变量提升,也就是函数内部的scope声明语句会提升到函数头部进行声明外部的scope会被函数内部的scope重新声明并赋值,此时就相当于scope下面这个函数。

//定义全局变量    var scope="全局变量";	function test(){		var scope;		document.writeln(scope + "
");//所以输出为undefined //定义局部变量,作用于函数内部 scope="局部变量"; //再次输出scope值 document.writeln(scope + "
");//输出scope值 } test();//调用函数

在根据我们的局部变量覆盖全局变量原理,就可以知道原来这是出现了提升变量而导致声明放在函数体的头部执行

三、总结

        变量提升是在js中可能发生的情况,在我们定义一个全局变量的时候,编写的函数如果存在同名的局部变量可能将全局变量替换,使用var修饰符修饰成员变量是作用于全局的,let修饰符是作用于块作用域(函数等)的,所以避免预防的方法就是变量定义中尽量不使用同名的变量名命名或者使用没有let来进行修饰

转载地址:http://pjtrn.baihongyu.com/

你可能感兴趣的文章
探索 .Net Core 的 SourceLink
查看>>
AgileConfig-如何使用AgileConfig.Client读取配置
查看>>
【gRPC】 在.Net core中使用gRPC
查看>>
整合.NET WebAPI和 Vuejs——在.NET单体应用中使用 Vuejs 和 ElementUI
查看>>
老人言:尽量用异步
查看>>
“既然计划没有变化快,那制订计划还有个卵用啊!”
查看>>
C#实现网页加载后将页面截取成长图片
查看>>
C# 在自定义的控制台输出重定向类中整合调用方信息
查看>>
【gRPC】ProtoBuf 语言快速学习指南
查看>>
C# 9 新特性 —— 补充篇
查看>>
Asp.Net Core使用Skywalking实现分布式链路追踪
查看>>
浅谈CLR基础知识
查看>>
Xamarin使XRPC实现接口/委托远程调用
查看>>
IdentityServer4 之 Resource Owner Password Credentials 其实有点尴尬
查看>>
轻量级 Kubernetes K3s - Github热点
查看>>
在.NET Core中使用Channel(一)
查看>>
Roslyn 使用 Directory.Build.props 管理多个项目配置
查看>>
单一职责在.NET中
查看>>
.NET Core 使用Topshelf方式创建Windows服务
查看>>
.net 5.0 中的 JsonConsole
查看>>