一、概念

1、变量声明

在JavaScript中,变量一般通过var关键字(隐式声明,let关键字声明除外)进行声明,如下通过var关键字声明a,b,c三个变量(并给其中的a赋值):

var a=1,b,c;                    //关键字显式声明变量a,b,c,并给a赋值
console.log(a); //1 //由于b,c已声明但未赋值,因此输出"undefined"
console.log(b); //undefined
console.log(c); //undefined //如果变量未声明,则输出未声明的报错信息
console.log(d); //Uncaught ReferenceError: d is not defined(…)

2、函数声明

在JavaScript中,函数一般直接通过关键字function进行声明(匿名函数除外)。如下通过function关键字声明一个a函数(或直接var声明一个变量a再赋值为一个函数,此时为函数表达式,但是两种方式都是声明的a最终得到的都是一个函数):

function a(){
//.......
}
console.log(a); //function a(){ //...... } 函数声明 var a = function(){
  //......
}
console.log(a); //函数表达式

二、区别

在JavaScript的执行机制中(预编译阶段),变量声明和函数声明是存在优先级的,函数声明的优先级大于变量声明。若同时声明一个函数和变量,函数名称和变量名称相同,则声明的变量无效,通过typeof我们可以看到,无论声明先后顺序,如果声明同名的函数和变量,则只有声明的函数有效,而声明的变量无效(相当于同名的函数覆盖了变量)。也就是:对于var声明的变量如果未赋值,则function定义的重名变量会覆盖掉var的声明;而当var声明的变量已被赋值,则function定义的重名变量无效。如下代码所示:

var a;
function a() {
alert("哈哈!")
}
console.log(a); //显示function函数定义

//声明顺序调过来也是一样的结果
function a() {
  alert("哈哈!")
}
var a;
console.log(a); // 显示function函数定义
//如果在上述情况下(javascript预编译阶段),直接给变量a赋值,则有以下结果(函数声明无效),声明顺序调过来也一样结果
function a() {
  alert("哈哈!");
}
var a = 1;
alert(typeof a);         //number,这是因为这时候javascript进入了代码解释执行阶段。变量a被赋值了数值1,所以输出为number类型
console.log(a); //1

原因:JavaScript的执行环境上下文相关。预编译阶段只有所有变量声明提前,执行阶段赋值表达式执行,导致重名声明失效,以执行结果为当前变量值。

三、参考资料

  1. Javascript变量预解析与函数声明提前
  2. Scope Cheatsheet
  3. JavaScript执行顺序详细介绍

关于Javascript中声明变量、函数的笔记的更多相关文章

  1. 在javascript中关于变量与函数的提升

    在javascript中关于变量与函数的提升 一.简介 在javascript中声明变量与函数的执行步骤: 1.先预解析变量或函数声明代码,会把用var声明的变量或者函数声明的代码块进行提升操作 2. ...

  2. JavaScript 中对变量和函数声明提前的演示样例

    如题所看到的,看以下的演示样例(能够使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发人员工具,进入控制台console输入)(使用技巧: 控制台输入时Shift+Enter能够中途代码 ...

  3. JavaScript 中定义变量时有无var声明的区别

    关于JavaScript中定义变量时有无var声明的区别 var a=5; //正确 a=5; //正确 在javascript中,以上两种方法都是定义变量的正确方法.微软的Script56.CHM中 ...

  4. 函数中声明变量不用Var的情况

    我们都知道函数中声明变量不用Var时这个变量会成为全局变量,但是并不是函数一开始执行就会把它变为全局变量,必须执行到这条语句. 看一段代码 function f(){    alert(a);    ...

  5. (转载)JavaScript中定义变量

    (转载)http://blog.163.com/xuxiaoqianhz@126/blog/static/165190577201061594421870/ JavaScript中定义变量有两种方式: ...

  6. 在Javascript中 声明时用"var"与不用"var"的区别,== 和 ===的区别

    今天,被问到两个JS问题,当时没回答到重点,问题虽然看起来简单,但是细节却马虎不得,在此做下记录: 1. 在Javascript中 声明时用"var"与不用"var&qu ...

  7. JavaScript 中的回调函数

    原文:http://javascriptissexy.com/ 翻译:http://blog.csdn.net/luoweifu/article/details/41466537 [建议阅读原文,以下 ...

  8. JavaScript学习系列2一JavaScript中的变量作用域

    在写这篇文章之前,再次提醒一下 JavaScript 是大小写敏感的语言 // 'test', 'Test', 'TeSt' , 'TEST' 是4个不同的变量名 JavaScript中的变量,最重要 ...

  9. JavaScript中的普通函数和箭头函数

    最近被问到了一个问题: javaScript 中的箭头函数 ( => ) 和普通函数 ( function ) 有什么区别? 我当时想的就是:这个问题很简单啊~(flag),然后做出了错误的回答 ...

随机推荐

  1. 1.搭建maven,eclipse创建maven项目

    1.下载maven包,下载地址为:http://maven.apache.org/download.cgi 2.解压zip包 3.eclipse 引入maven: window-Preferences ...

  2. 358. Rearrange String k Distance Apart

    /* * 358. Rearrange String k Distance Apart * 2016-7-14 by Mingyang */ public String rearrangeString ...

  3. "visual studio 2012 安装引擎拒绝访问" 错误的解决

    首先,我们看一下错误的具体提示,如下图所示: 这个错误,是我安装了那么多年Visual Studio的经历中,第一次遇到.太恶心了,昨天一直安装失败,导致后续其它软件的安装一再拖延.目前网上的解决方案 ...

  4. spring-boot实战【01】:Hello World项目搭建

    原文:http://www.cnblogs.com/yucongblog/p/7355519.html 简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用S ...

  5. andriod Java中度转度分秒

    public String trandu2m(double d) { //gisoracle 编号 try { //double dd = Convert.ToDouble(str); String ...

  6. 怎样用命令行管理SharePoint Feature?

    普通情况下对IT管理者来说.在SharePoint Farm中维护Feature,更喜欢使用命令行实现,这样能够省去登录到详细网站的操作. 比方IT接到end user的一个需求,要开启Site Co ...

  7. SolidEdge 打开工程图提示图纸已过期怎么办

    如下图所示,打开工程图时提示图纸已过期   点击工具-图纸视图跟踪器,按提示打开过期的装配体文件   更新这个装配体文件   然后切换到刚才提示过期的工程图文件,点击更新视图,下次再打开的时候就不会提 ...

  8. Git使用笔记01

    本文基本的參考文章链接例如以下所看到的: Pro Git(中文版) Git教程 Git使用教程 简单介绍与说明 Git是一个分布式版本号管理系统,是为了更好地管理Linux内核开发而创立的.Git能够 ...

  9. Jstl indexOf 参考

    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> < ...

  10. Unable to satisfy the following requirements解决方式

    今天从git上面download我们项目,然后向往常一样安装Cocoapods.可是却突然发现报错了,尝试了几遍.发现一直报错. 然后我这才看了一下,安装Cocoapods的日志,发现抛出了一个报错. ...