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. HDU 5974 A Simple Math Problem(数论+结论)

    Problem Description Given two positive integers a and b,find suitable X and Y to meet the conditions ...

  2. fedora 系统安装后常用设置

    #表示root命令  $表示普通用户命令 给普通用户添加sudo权限 #visudo    (编辑/etc/sudoers文件的命令) root all = (all) all username al ...

  3. 记开发个人图书收藏清单小程序开发(九)Web开发——新增图书信息

    书房信息初始化已完成,现在开始处理图书信息新增功能. 主要是实现之前New Razor Pages的后台部分. 新增需要保存的Model:Book.InitSpec.cs /Models/Book.I ...

  4. form 认证 读取

    class Program { public static CookieContainer cc { get; set; } static void Main(string[] args) { str ...

  5. (转)最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等

    什么是 RegExp? RegExp 是正则表达式(Regular expression)的缩写,作用是对字符串执行模式匹配. 通常用于格式验证.正则替换.查找子串等 各种编程语言的正则表达式基本相同 ...

  6. k8s service

    Service也是k8s的最小操作单元,是真实应用服务的抽象 Service通常用来将浮动的资源与后端真实提供服务的容器进行关联 Service对外表现为一个单一的访问接口,外部不需要了解后端的规模与 ...

  7. BZOJ 3239--Discrete Logging(BSGS)

    3239: Discrete Logging Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 635  Solved: 413[Submit][Statu ...

  8. PHP中关于foreach的笔试题

    1,php与C++的不同之处是PHP中变量没有局部作用域,只有函数作用域和全局作用域.如下函数,在php中,$name的作用域是函数test():在C++中$name的作用域是for循环体,for循环 ...

  9. HTTP报文语法/HTTP组成

        一.HTTP报文分类:请求报文和响应报文 请求报文会向Web服务器请求一个动作,响应报文会将请求的结果返回给客户端 请求报文格式: <method>  <request-UR ...

  10. css 实现关闭按钮 X

    .close::before { content: "\2716";} 然后就显示出来了 这里有个更直接的例子 <!DOCTYPE html> <html lan ...