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. live kalilinux能保存文件和设置

    win32diskimager写入kalilinux镜像,建议用parrot sec os gparted /dev/sdb,新建分区sdb3,Lable输入persistence 挂载/dev/sd ...

  2. context:propertyPlaceholder

    Activates replacement of ${...} placeholders by registering a PropertySourcesPlaceholderConfigurer w ...

  3. 初尝2D骨骼动画编辑工具SPINE,并into Unity3D

    一.SPINE使用 研究2D骨骼动画,CYou的朋友介绍我SPINE这个工具,开发自Esoteric Software的一款专门制作2D动画的软件,网络上的资料还很少,我这从半吊子美术技术的角度简单说 ...

  4. python signal

    在了解了Linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解.signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时 ...

  5. solr特点三: 基于Solr实现排序定制化参考

    排序实现有N种形式,最低成本.最快响应时间是目标 一份索引,支持N种排序策略并且在线互不干扰是要考虑的每一种实现,处理的场景是不同的,不要千篇一律 020排序,从索引到效果,有不少坑,这篇文章没有细说 ...

  6. Spring中ApplicationContext和beanfactory区别---解析一

    BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...

  7. asp.net——XML格式导出Excel

    下面介绍一种导出Excel的方法: 此方法不需要在服务器上安装Excel,采用生成xml以excel方式输出到客户端,可能需要客户机安装excel,所以也不会有乱七八糟的权限设定,和莫名其妙的版本问题 ...

  8. ES6摘抄

    1.函数可选参数function log(x, y = 'World') {} 只能作为尾参数使用,因为如果不是尾参数还是要输入的.2.函数参数默认值与解构赋值结合使用.(注意对象冒号解构等号)fun ...

  9. 转载WPF:创建你的第一个WPF项目

    转载:http://www.cnblogs.com/pengjinyu/archive/2009/08/19/1549845.html

  10. 细节之strcat

    写代码也这么多年了,有些非常基础的东西却让我差点栽跟头: 有如下一种场景的需求代码: char tmp; ]; memset(input, , ); ) // ptr是得到了某块全局内存的 { tmp ...