简单谈一谈JavaScript中的变量提升的问题
1,随笔由来
第一天开通博客,用于监督自己学习以及分享一点点浅见,不出意外的话,应该是一周一更或者一周两更。
此博客所写内容主要为前端工作中遇上的一些问题以及常见问题,在此基础上略微发表自己的一点浅见,如有出现错误,请看到的各位能够不吝赐教,此致谢意。
前几天在某技术群中水的正欢,忽然有群友提出了一个问题,虽然不难,卻是常人忽视的点,且出现次数较多,所以在此写一点东西,提醒一下自己。
2,JavaScript中的var 与 function
首先我们来看下面这个demo
var f = function(){
console.log('1');
};
function f(){
console.log('2');
};
f();//1
看到这里的时候,有人可能会问为什么,不是应该输出2吗?
这里要说到一个优先级问题,javascript(es5)中,var 和 function 定义的变量是要上升的,也就是说,var跟function定义变量的这个过程,是要放到该作用域的最上方,并且var优先于function。
为了证实 var 与 function 的优先级,我们可以测试4段简单的代码:
//第一段
var e;
function e(){};
console.log(typeof e);//function
//第二段
function e(){};
var e;
console.log(typeof e);//function
//第三段
var e;
console.log(typeof e);//undefined
//第四段
function e(){};
console.log(typeof e);//function
到这的时候,有人可能要提出疑问了,为什么,var在前,function在后,我们第一段代码输出的却是1而不是2呢?不是应该被function覆盖掉吗?
这里要解释一下,var的提升,只负责提升定义的那一个行为。我们来解读一下 var one = ‘1’,这里应该是2个行为 var one;one=1;
所以,我们上面的代码实际上是这个样子:
var f;
function f(){
console.log('2');
};
f = function(){
console.log('1');
};
f();//1
这里f指向一个匿名函数,function(){console.log('1');};覆盖了之前的定义。
JavaScript中变量的定义,大抵可参考上面的顺序,不过在此作者还是建议大家按照顺序去定义变量,并且按照此作用域中 var > function > 赋值 的顺序以便阅读。
最后感谢屏幕前的你花了宝贵的时间来看这点小东西。
简单谈一谈JavaScript中的变量提升的问题的更多相关文章
- 谈谈javascript中的变量提升还有函数提升
在很多面试题中,经常会看到关于变量提升,还有函数提升的题目,所以我就写一篇自己理解之后的随笔,方便之后的查阅和复习. 首先举个例子 foo();//undefined function foo(){ ...
- JavaScript中的变量提升和函数提升
在EcmaScript5中只有全局作用域和函数作用域,EcmaScript6增加了块级作用域. 块级作用域(一对花括号{}即为一个块级作用域) 变量提升 console.log(name); //un ...
- JavaScript中的变量提升和严格模式
1.什么是变量提升 所谓的变量提升指的是:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体(作用域)的最顶部. //先声明后使用 var x; console.log(x) ...
- 一篇文章带你了解JavaScript中的变量,作用域和内存问题
1 在JavaScript中的变量分别区分为两种: 一种为基本类型值,一种为应用类型值. 基本类型值指的是简单的数据段 引用类型值为可能由多个值组成的对象 引用类型的值是保存在内存中的对象,JavaS ...
- JavaScript中的变量在内存中的具体存储形式
栈内存和堆内存 JavaScript中的变量分为基本类型和引用类型 基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问 引用类型是保存在堆内存中的对象,值大小不固 ...
- JavaScript 中的变量命名方法
三种命名方法 在程序语言中,通常使用的变量命名方法有三种:骆驼命名法(CamelCase),帕斯卡命名法(PascalCase)和匈牙利命名法. 依靠单词的大小写拼写复合词的做法,叫做"骆驼 ...
- (转载)JavaScript中定义变量
(转载)http://blog.163.com/xuxiaoqianhz@126/blog/static/165190577201061594421870/ JavaScript中定义变量有两种方式: ...
- 在javascript中关于变量与函数的提升
在javascript中关于变量与函数的提升 一.简介 在javascript中声明变量与函数的执行步骤: 1.先预解析变量或函数声明代码,会把用var声明的变量或者函数声明的代码块进行提升操作 2. ...
- JavaScript 中定义变量时有无var声明的区别
关于JavaScript中定义变量时有无var声明的区别 var a=5; //正确 a=5; //正确 在javascript中,以上两种方法都是定义变量的正确方法.微软的Script56.CHM中 ...
随机推荐
- [转]MySQL innodb buffer pool
最近在对公司的 MySQL 服务器做性能优化, 一直对 innodb 的内存使用方式不是很清楚, 乘这机会做点总结. 在配置 MySQL 的时候, 一般都会需要设置 innodb_buffer_poo ...
- Autumn is a second spring when every leaf is a flower.
Autumn is a second spring when every leaf is a flower. 秋天即是第二个春天,每片叶子都是花朵.——阿尔贝·加缪
- Web Api 简介
ASP.NET Web API 简介 ASP.NET MVC 4 包含了 ASP.NET Web API, 这是一个创建可以连接包括浏览器.移动设备等多种客户端的 Http 服务的新框架, ASP. ...
- Program.cs
Program.cs using System; namespace HelloWorld { class Program { [STAThread] static void Main(string[ ...
- [Spark] Spark的RDD编程
本篇博客中的操作都在 ./bin/pyspark 中执行. RDD,即弹性分布式数据集(Resilient Distributed Dataset),是Spark对数据的核心抽象.RDD是分布式元素的 ...
- requirejs学习
- Mark Down 尝试
Hello World iawriter sublime text
- 模板——RMQ
就是模板 #include <cstdio> #include <cstring> #include <iostream> using namespace std; ...
- 伪共享和缓存行填充,从Java 6, Java 7 到Java 8
关于伪共享的文章已经很多了,对于多线程编程来说,特别是多线程处理列表和数组的时候,要非常注意伪共享的问题.否则不仅无法发挥多线程的优势,还可能比单线程性能还差.随着JAVA版本的更新,再各个版本上减少 ...
- jquery-ajax完整写法
$(function(){ $('#btn').click(function(){ var obj = $(this); //has_click 防止重复多次点击 var has_click = ob ...