javascript定义函数有3种方式:

//3种函数定义方式,前两种常用

            /**
* 1,function 语句式
* 形式:句子
* 名称:有名
* 性质:静态
* 解析时机:优先解析
* 作用域:具有函数的作用域(正常的作用域)
*/
function test01(){
alert("我是test01");
}
//test01(); /**
* 2,函数直接量 ECMAScript 推荐的方式
* 形式:表达式
* 名称:匿名
* 性质:静态
* 解析时机:顺序解析
* 作用域:具有函数的作用域(正常的作用域)
*/
var test02 = function(){
alert("我是test02");
};
//test02(); /**
* 3,function 构造函数式,a,b是形参,函数执行体直接写在后边,以分号结束
* 形式:表达式
* 名称:匿名
* 性质:动态
* 解析时机:顺序解析
* 作用域:顶级函数(顶级作用域)
*/
var test03 = new Function("a","b","return a+b;");
//alert(test03(10,20));

区别:

1,效率方面对比,先new一个date,得到当前毫秒数,循环10万次,new10万个函数出来后,再得到当前毫秒,相减对比

        //三种方式效率的对比
var d1 = new Date();
var t1 =d1.getTime();
for(var i=0;i<100000;i++){
function test1(){ ;}; //function语句式
//var test2 = new Function(); //构造函数式
} var d2 = new Date();
var t2 = d2.getTime();
alert(t2-t1);

可以看到function语句式比构造函数式效率要高,函数直接量和function语句式效率差不多。

原因:这就上边说的性质--静态和动态的区别,函数直接量和function语句式被javascript解释一次,放在了内存,以后用到的话直接调用,占用内存,所以说是“静态”的。而构造函数式是每一次调用都动态新建一个,用完之后就销毁了,不占用内存,所以说是“动态”的。所以,有些程序只希望调用一次,就可以用动态的构造函数式。

解析、执行顺序:

/**
* ************************解析顺序*******************************************,
* 对于function语句式的函数,javascript解析器会优先的解释
* javascript解析器会先看所有的全局变量,放到内存,test04()、test05会被当做全局变量
* test04()能正常执行,但是test05只有
*/
//test04();
// function test04(){
// alert("test04");
// } //test05(); 执行不了,缺少对象
/**
* undefined,表示变量声明了,没有被赋值,
* 执行到此步时,还没有把function赋给test05,相当于先声明后赋值的概念
*/
//alert(test05);
var test05 = function(){
alert("test05");
}; //********************执行顺序经典例子**************
/**
* js解析器会先找所有的function当做全局变量放内存,就找到了1,4,静态的,4把1覆盖,
* 执行到函数1,所以打印4
* 执行到函数2,是动态构建的覆盖4,所以打印2,之后销毁
* 执行到函数3,覆盖函数4,打印3
* 执行到函数4,其实调用的是函数3,打印3
* 执行到函数5,动态创建一个覆盖3,打印5,后销毁
* 执行到函数6,覆盖函数3,打印6
*/
//alert结果:4 2 3 3 5 6
function f(){ return 1;} //函数1
alert(f()); //返回值为4,说明第1个函数被第4个函数覆盖, var f = new Function("return 2;"); //函数2
alert(f()); //返回值为2,说明第4个函数被第2个函数覆盖 var f = function(){ return 3;}; //函数3
alert(f()); //返回值为3,说明第4个函数被第3个函数覆盖 function f(){ return 4;} //函数4
alert(f()); //返回值为3,说明第4个函数被第3个函数覆盖 var f = new Function("return 5;"); //函数5
alert(f()); //返回值为5,说明第3个函数被第5个函数覆盖 var f = function(){ return 6;}; //函数6
alert(f()); //返回值为6,说明第3个函数被第6个函数覆盖

函数作用域:

            /**
* ******************函数作用域的概念*************************
*/
//var test = new Function("return k;");
var k = 1;
function t1(){
var k = 2; //局部变量
//function test(){ return k; } //function语句式,k=2
//var test = function(){ return k;}; //函数直接量,k=2 ,两者都是函数的作用域
var test = new Function("return k;"); //构造函数,顶级的作用域,相当于在全局new一个函数,只能找到全局的k=1
alert(test());
}
t1();

总结:

1,function语句式、函数直接量 就会被解释一次,是静态的,有函数的作用域,Function构造函数式每次执行都动态new一次,说明有顶级作用域。

2,解析机制,function语句式 相当于全局变量,会被优先解析,其他2种执行到哪解释到哪,顺序执行。

第十篇----------javascript函数的三种定义方式及区别的更多相关文章

  1. JavaScript 函数的两种声明方式

    1.函数声明的方式 JavaScript声明函数有两种选择:函数声明法,表达式定义法. 函数声明法 function sum (num1 ,num2){ return num1+num2 } 表达式定 ...

  2. Linux基石【第二篇】虚拟网络三种连接方式(转载)

    在虚拟机上安装完Centos系统后,开始配置静态IP,以方便在本宿主机上可以访问虚拟机,在曲折的配置中,了解到虚拟机还有三种连接方式:Bridged,NAT和Host-only,于是,我又一轮新的各种 ...

  3. 第十篇--------javascript函数-参数

    javascript函数的参数:形参,实参 //function 参数 //形参列表 function test(a,b,c,d){ //alert(test.length); //形参个数,4个 / ...

  4. 浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序

    在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...

  5. c++中三种继承方式的区别

    public公有继承 protected保护继承 private私有继承 我们知道类的private和protected成员,在类外是不可以使用的.只有public成员可以在类外直接使用. 公有继承时 ...

  6. PHP字符串三种定义方式

    PHP的字符串有三种定义方式:单引号 .双引号 .定界符  1.单引号:指定一个简单字符串的最简单的方法是用单引号(字符 ')括起来. 在被单引号括起来的字符串中,要再表示一个单引号,需要用反斜线(\ ...

  7. EF三种编程方式的区别Database first ,Model first ,code first

    首先对于EF中先出现的datebase  first和model first两种编程方式,其的区别根据字面意思很容易能够理解. datebase  first就是代表数据库优先,那么前提就是先创建数据 ...

  8. 第十篇---javascript函数this关键字

    <script type="text/javascript" charset="utf-8"> //this:this对象是指运行时期基于执行环境所 ...

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

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

随机推荐

  1. 20169221 2016-2017-2《移动平台与android开发》学习总结

    每周作业连接汇总 第一周<Intellj IDEA 简易教程>学习,码云的基础使用.由于第一次写作业,网络攻防作业占据了我整个周四周五周六的时间这周java时间被挤没了,所以没有完成所有学 ...

  2. js 根本没有“JSON对象”这回事! JSON对象——转

    前言 写这篇文章的目的是经常看到开发人员说:把字符串转化为JSON对象,把JSON对象转化成字符串等类似的话题,所以把之前收藏的一篇老外的文章整理翻译了一下,供大家讨论,如有错误,请大家指出,多谢. ...

  3. Codeforces758C Unfair Poll 2017-01-20 10:24 95人阅读 评论(0) 收藏

    C. Unfair Poll time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  4. EBS11i - 常用Profile

      Profile Name 说明 设置建议 FND: Enable Cancel Query 当执行一个超长时间的查询时,会出现一个 Cancel窗口,允许用户取消.比如我们在SO 界面没有输入条件 ...

  5. Android-自定义开关(升级版)

    效果图: 定义一个类,取名为MySwitch.java,此类去继承View,为何是继承View而不是去继承ViewGroup呢,是因为自定义开关没有子控件,之需要操作自身绘制即可 package cu ...

  6. ZooKeeper 一致性协议 ZAB 原理

    一致性协议有很多种,比如 Paxos,Raft,2PC,3PC等等,今天我们讲一种协议,ZAB 协议,该协议应该是所有一致性协议中生产环境中应用最多的了.为什么呢?因为他是为 Zookeeper 设计 ...

  7. MSP430 G2553 Launchpad实现电容测量

    一.基本原理 对于Source-Free RC电路,其电容放电的特性可以描述为: 其中V0是电容的初始电压,t是放电时间,R是串接的电阻阻值,C是电容值,v(t)是t时刻电容上的电压.因此,若已知V0 ...

  8. Excel2010画动态甘特图

    哈哈!你居然真的看简介点进来啦,我也想八一八Henry gantt本人的故事,可是我查了好些资料,一个槽点都没有发现,不过人生经历还是蛮拼的: 此人活了58年,前半生就是一个中规中距的机械工程师&am ...

  9. ZENCART 菜鸟找人一起学习

    ZENCART 是一个很强大的外贸CMS程序. 现在刚开始学习,虽然晚了五年…… 有兴趣的朋友加群一起学习交流吧 学习论坛: http://www.zencart-bbs.com/thread-htm ...

  10. c# 线程的基本使用

    创建线程 线程的基本操作 线程和其它常见的类一样,有着很多属性和方法,参考下表: 创建线程的方法有很多种,这里我们先从thread开始创建线程 class Program { static void ...