1.函数声明的方式

JavaScript声明函数有两种选择:函数声明法,表达式定义法。

  • 函数声明法

      function sum (num1 ,num2){
    return num1+num2
    }
  • 表达式定义法

      var sum = function(num1,num2){
    return num1+num2
    };

2.扒一扒两种函数声明的区别

解析器会率先读取函数声明(也就是说函数声明的优先级较高),并使其在执行任何代码之前可以访问(将函数声明提升到代码树顶部);至于函数表达式声明,则必须等到解析器执行到它所在的代码行,才会执行,无法自动提升。

同样的函数使用不同的定义方式,调用的时候会产生不同的效果。

// 函数声明法
var num = add(1, 2);
console.log(num);// 3 function add(a, b) {
return a + b
} // 函数表达式声明
var num = add(1, 2);
console.log(num);//Uncaught TypeError: undefined is not a function var add = function (a, b) {
return a + b
}

我们来看一看这两种声明方式到底对代码产生了怎样的影响。

首先看函数声明,由于发生了代码提升,实际的代码如下

// 函数声明法
function add(a, b) {
return a + b
}
var num = add(1, 2);
console.log(num);// 3 //function add(a, b) {
// return a + b
//}

再看表达式声明法,同样将变量add提升,add()函数调用的时候,只声明了变量add,却没有进行赋值。(此时的add变量是undefined)实际的代码如下。

// 函数表达式声明
var add;
var num = add(1, 2);
console.log(num);//Uncaught TypeError: undefined is not a function add = function (a, b) {
return a + b
}

3.关于变量提升和执行顺序

JavaScript是解释型语言,但它并不是逐行执行的。解析过程可以理解为两个阶段:一个是预处理阶段,JavaScript将脚本代码转换为字节码,该过程中将所有定义的变量提升到代码树顶端;第二个阶段,JavaScript解释器借助执行环境,把字节码生成机械码,该过程中才发生变量的赋值,并顺序执行。

console.log(a);
//Error:a is not defined ,直接报错,下面语句没法执行,以下结果为注释该句后结果
console.log(b) //undefined ,变量发生提升
var b="Test";
console.log(b);//Test

也就说JavaScript值执行第一句语句之前就已经将函数/变量声明预处理了

var b="Test" 相当于两个语句

var b;(undefined结果的来源,在执行第一句语句之前已经解析)

b=”Test”(这句是顺序执行的,在第二句之后执行)

这也是为什么我们可以在方法声明语句之前就调用方法的原因。

4.练一练

下面我们用一个经典的面试题目的一部分来对本篇文章进行总结

请问下面这段代码的执行结果是什么?

function Foo() {
getName = function () {
alert (1);
};
return this;
} Foo.getName = function () {
alert (2);
}; Foo.prototype.getName = function () {
alert (3);
}; var getName = function () {
alert (4);
}; function getName() {
alert (5);
} getName()

答案加载中...

答案加载中...

答案加载中...

答案加载中...

答案加载中...

答案加载中...

答案加载中...

答案加载中...

答案加载中...

答案加载中...

答案加载中...

答案加载中...

答案加载中...

答案加载中...

揭晓答案:

4

这里我主要讲解一下第二问中为什么是4,其他的在后续文章中进行说明。上面的代码实际上是这个样子滴

function Foo() {
getName = function () {
alert (1);
};
return this;
}
var getName;//只提升变量声明
function getName() { //提升函数声明,覆盖var的声明
alert (5);
}
Foo.getName = function () {
alert (2);
};
Foo.prototype.getName = function () {
alert (3);
};
getName = function () { //最终的赋值再次覆盖function getName声明
alert (4);
};
getName();//最终输出4

JavaScript 函数的两种声明方式的更多相关文章

  1. JavaScript脚本的两种放置方式

    JavaScript脚本的两种放置方式 1在body里用 script标签引用 2 直接写在<script></script>标签之中

  2. 第63天:json的两种声明方式

    一. json 两种声明方式 1. 对象声明   var  json = {width:100,height:100} 2. 数组声明   var  man = [        //  数组的 js ...

  3. javascript中对象两种创建方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. javascript 函数的4种调用方式与 this(上下文)的指向

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! javascript中作用域链和this(上下文)的指向是很容易混淆的,简单的说就是: 作用域链取决于函数 ...

  5. 第十篇----------javascript函数的三种定义方式及区别

    javascript定义函数有3种方式: //3种函数定义方式,前两种常用 /** * 1,function 语句式 * 形式:句子 * 名称:有名 * 性质:静态 * 解析时机:优先解析 * 作用域 ...

  6. javascript 函数的几种声明函数以及应用环境

    本页只列出常用的几种方式,当然还有比如new Function()以及下面三种的组合. 1.函数式声明 例子:function sum(a,b){ return a+b; }; 2.函数表达式声明(匿 ...

  7. javascript函数的4种调用方式

    在javascript中一共有4种函数调用模式,分别是:方法调用模式.函数调用模式.构造函数调用模式和apply(call)调用模式,这4种模式的主要差异在于如何初始化关键参数this. 方法调用模式 ...

  8. js的数据类型、函数、流程控制及变量的四种声明方式

    运算符 基本运算符 加 + 减 - 乘 * 除 / 取余 % 自增 ++ eg: 1++ 或 ++1 自减 -- eg: 1-- 或 --1 注:++或--写在前面表示优先级最高,先进行自增或者自减 ...

  9. JavaScript 函数的4种调用方法

    JavaScript 函数有 4 种调用方式. 每种方式的不同方式在于 this 的初始化. 作为一个函数调用 function myFunction(a, b) { return a * b; } ...

随机推荐

  1. [转]在Eclipse中使用JUnit4进行单元测试(初级篇)

    首先,我们来一个傻瓜式速成教程,不要问为什么,Follow Me,先来体验一下单元测试的快感! 首先新建一个项目叫JUnit_Test,我们编写一个Calculator类,这是一个能够简单实现加减乘除 ...

  2. Unity插件使用总结

    移动文件夹位置会引起错误的插件:EasySave2.MaterialUI.Gamestrap UI.Beautify

  3. javaWeb高级编程(1)

    十月 24, 2016 10:41:43 上午 org.apache.catalina.core.StandardContext setPath警告: A context path must eith ...

  4. 【生活没有希望】hdu1166敌兵布阵 线段树

    线段树水题刷刷,生活没有希望 最近看到代码跟树状数组差不多短的非递归线段树,常数也很小——zkw线段树 于是拿道水题练练手 短到让人身无可恋 ;pos;pos/=) a[pos]+=x;} ,ans= ...

  5. Django--全文检索功能

    经过两个月的时间,毕设终于算是把所有主要功能都完成了,最近这一周为了实现全文检索的功能,也算是查阅了不少资料,今天就在这里记录一下,以免以后再用到时抓瞎了~ 首先介绍一下我使用的Django全文检索逻 ...

  6. ThinkPHP框架的一些基础应用

    这是俺滴师傅给俺传授了的知识,特在此分享. TP框架,做PHP开发的都应该有所耳闻.下面,我们就来说说入口文件的生成: 创建新项目时,首先,在目录文件下创建一个新的文件夹.然后将Thinkphp框架文 ...

  7. MVC4 项目迁移 服务器被配置为不列出此目录的内容

    前言: 将服务器中已经发布在IIS7上的网站,迁移到虚拟机中. 方便以后出现问题了,可以在自己的虚拟机中做测试提高工作效率. 问题: 迁移的6个MVC项目中有俩个碰到如下问题. 应用程序"T ...

  8. 新入门node.js必须要知道的概念

    一.对于一个刚入门node.js的朋友来说,一定要了解一些基础概念: 今年我正式进入社会后,发现自己所知道的IT方面的知识,真的只是牛毛,原来人外有人,山外有山,还需要继续努力.下面是一些我的自学习心 ...

  9. Txt格式配置表无法解析的问题——BOM

    今天再次遇到同一个问题:策划给来一个Txt格式配置表,我用解析类去读取,返回的结果为空.解析类参数是:主键key,文件名fileName,错误提示errorTip. 写读取语句的时候,主键key我是直 ...

  10. PMP备考_第五章_项目范围管理_实践思考

    项目范围管理 前言 今天学习项目范围管理的内容,深切的感受到了原单位在项目管理方面存在的问题,今天在这里做一个总结,既相当于对项目范围的一个学习整理,也相当于自己对项目实践过程中存在问题的一个思考. ...