观察下面两段代码,试写出hello('word');的运行结果:

// 变量式声明
function hello(msg){
alert(msg);
var msg = function(){};
alert(msg);
} //函数式声明
function hello(msg){
alert(msg);
function msg (){};
alert(msg);
}

对于变量式声明,首先弹出word,然后弹出function,而函数式声明,则两次都是弹出function.这是为什么呢?

一: 函数式声明

function hello(msg){
alert(msg); //放在最前面的位置打印msg,是function
function msg(){
//这个msg是函数式声明,它会贯穿于整个fun函数的作用域
//也就是说,只要fun一旦调用,甚至只要是进入语法分析阶段
//那么msg函数就会首先解析,你可以把它想象成它是在fun函数
//内的第一个变量。有的书上称这种现象为声明被提前或提升。
}
alert(msg);//放在最末尾的位置打印msg,也是function
// 说明函数式声明在hello作用域内部是贯穿的
} hello('xxx');
msg();// ReferenceError: msg is not defined
//说明函数式声明的msg也只是存在于hello函数内

二:变量式声明

function hello(msg){
 alert(abc); // 此时为undefined
alert(msg); // 此时为形式参数msg的值
var abc = function(){
//这种是变量式声明,它在fun函数内的位置是固定的,也就是说
// var abc之前,abc的值在fun内是undefined
// var abc之后,abc才是它声明的值
// 这种方式你可以理解成在fun函数的第一行写了一个var abc;
// 也正因为如此,fun内声明的变量,会切断同名外部变量的引用;
// 不论在hello作用域之外,abc的值是多少,在hello内部,在var abc之前,始终是undefined
// 这是面试官最喜欢光顾的地方之一
} alert(abc); // 此时才是function // 这里把abc换成msg,道理也是一样的。对于hello内部来说,它的形参,就相当于是hello内部的局部变量。
// 这里有意用abc来替换msg,其实是为了简化问题,减少干扰项。既然是都hello内的局域变量,那么在声明之前
// 它的值为undefined也就是理所当然的事了。这里唯一有个要注意的地方就是,形参的声明,出现在所有局部变量之前。
// 后面对局部变量进行重复声明,系统会直接无视重复的声明过程,但是声明同时有赋值的话除外。
}
   总结一点:函数式声明会上升到所属作用域的最前面, 变量式声明则不会.
 
   最后补充一点:
var abc = function(){};
   实际上是abc保存了一个无名函数的引用;本质上abc是一个变量.
   而 function abc(){} 是一个有名函数;本质上abc是函数;
 
  如果你喜欢,你可以用多个变量保存同一个函数的引用:

var xxx = abc; var bbb = abc;

引用可以无数,但是真身始终唯一。

   // xxx = null,bbb=null之后,abc该干嘛干嘛,而 var abc = function(){}; abc = null之后你就彻底的失去了有关abc的一切。
   abc从此石沉大海,从江湖上隐姓埋名,销声匿迹.......
 
  虽然两者在功能上是等价的,但是呢,我个人还是蛮倾向于把子函数, 人为的写在前面,这是为了避免压缩合并时,造成各种意外的结果。
  如果不是通用方法,我习惯用变量式声明,当然,这只是个人习惯。
 
对于函数式声明,它在整个作用域内可见,有的书上说是声明提升,有的说是声明提前。把这种现象取一个什么名头,不是那么重要了。
最后还要强调一点:命名函数表达式的名字只在该函数的作用域内部有效。也就是说,在hello函数内,无论用哪种方式声明msg这个函数,那么出了hello函数,都是不存在的。

javascript中的函数式声明与变量式声明的更多相关文章

  1. JavaScript中var和this定义变量的区别

    JavaScript中var和this定义变量的区别 在js中声明变量时可以使用var和this,但使用this的有很大一部分参考书是没有的,经过查阅相关资料总结如下: 用var和this声明变量,存 ...

  2. 解读JavaScript中的Hoisting机制(js变量声明提升机制)

    hoisting机制:javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 知识点一:javascript是没有 ...

  3. java基础58 JavaScript的几种格式和变量的声明方式(网页知识)

    1.JavaScript的几种格式 1.1.JavaScript的特点 1.跨平台性    2.安全性.(javaScript代码不能直接访问电脑硬盘上的信息) 1.2.Java与javaScript ...

  4. JavaScript中的作用域以及this变量

    原文:Scope and this in JavaScript 今天我想简单讨论下关于JavaScript的作用域和this变量."作用域"的概念就是说.我们的代码能够从哪里去訪问 ...

  5. 通过代数,数字,欧几里得平面和分形讨论JavaScript中的函数式编程

    本文是对函数式编程范式的系列文章从而拉开了与以下延续一个. 介绍 在JavaScript中,函数只是对象.因此,可以构造函数,作为参数传递,从函数返回或分配给变量.因此,JavaScript具有一流的 ...

  6. JavaScript中是如何定义私有变量的

    前言 JavaScript并不像别的语言,能使用关键字来声明私有变量. 我了解的JavaScript能用来声明私有变量的方式有两种,一种是使用闭包,一种是使用WeakMap. 闭包 闭包的描述有很多种 ...

  7. javascript中的正則表達式

    对文本数据进行操作是JavaScript中常见的任务.正則表達式通过同意程序猿指定字符串匹配的模式来简化诸如验证表单中输入是否具有正确格式之类的任务. 1.正則表達式标记: 字符 含义 举例 i 大写 ...

  8. JavaScript中的陷阱(关于变量声明,函数)

    查看:http://www.css88.com/archives/5347#more-5347

  9. [置顶] Ruby,Scala和JavaScript中的函数式编程(一)

    函数式编程(英语:Functional programming)或者函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象.函数编程语言最重要的 ...

随机推荐

  1. 关于解决python线上问题的几种有效技术

    工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...

  2. 讓TQ2440也用上設備樹(1)

    作者:彭東林 郵箱:pengdonglin137@163.com QQ:405728433 開發板 TQ2440 + 64MB 內存 + 256MB Nand 軟件 Linux: Linux-4.9 ...

  3. Spring注解

    AccountController .java Java代码   1.        /** 2.         * 2010-1-23 3.         */ 4.        packag ...

  4. SAP CRM 显示消息/在消息中进行导航

    向用户展示消息,在任何软件中都是十分重要的. 在SAP CRM WEB UI中展示消息,不是一项很难的任务,只需要创建消息并在之后调用方法来显示它 消息类和消息号: 我在SE91中创建了如下的消息类和 ...

  5. 【干货分享】流程DEMO-费用报销

    流程名: 费用报销 业务描述: 流程发起时,要选择需要关联的事务审批单,会检查是否超申请,如果不超申请,可以直接发起流程,如果超了申请,需要检查预算,如果预算不够,将不允许发起报销申请,如果预算够用, ...

  6. 手机游戏渠道SDK接入工具项目分享(二)万事开头难

    一般接到任务后程序员们通常都开始着手进行技术调研了,但我这活是项目负责人.还有一大堆事情要先期准备,没人能帮忙. 一.人力配置 考虑的之前已经有一波人搞了大半年,但没有起色,先期也没有太大人力需求,所 ...

  7. Atitit.软件开发的三层结构isv金字塔模型

    Atitit.软件开发的三层结构isv金字塔模型 第一层,Implements 层,着重与功能的实现.. 第二次,spec层,理论层,设计规范,接口,等.流程.方法论 顶层,val层,价值观层,原则, ...

  8. 为支持ASP.NET5跨平台,Jexus再添新举措

    Jexus作为一款运行于Linux/FreeBSD平台上,以支持ASP.NET著称的高性能HTTP服务器和反向代理服务器,继5.6版完成对OWIN标准应用的支持后,就把着力点放到了对ASP.NET5的 ...

  9. EasyPR--开发详解(7)字符分割

    大家好,好久不见了. 一转眼距离上一篇博客已经是4个月前的事了.要问博主这段时间去干了什么,我只能说:我去“外面看了看”. 图1 我想去看看 在外面跟几家创业公司谈了谈,交流了一些大数据与机器视觉相关 ...

  10. 如何在VMware中安装Windows Phone SDK 8.0 (支持模拟器调试)

    相信很多开发者目前的系统还是Win7或Mac,一般不会为了开发某个程序而重装系统,所以我们就需要用到VMware这类的虚拟机来模拟预期的开发环境.在开始介绍前,给大家说明下我当前的软硬件环境,本文所讲 ...