函数之定义

定义函数的方式有三种:

  • 关键字function来定义
  1. 函数声明语句 function f(){}
  2. 函数定义表达式:常用形式:var f = function(){};   //这里的分号不能少
  • 使用构造函数Function: var f = new Function(),里面传入参数,最后一个参数默认为函数体,前面的参数则为函数的参数。(不建议使用这种方法,因为这种方法会导致解析两次代码,1:常规解析EMCAscript代码,2:解析传入构造函数中的字符串,从而会影响性能。)

eg: var sum = new Function(“num1", "num2", "return num1 + num2");

使用前两种方式定义该函数:

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

使用函数声明语句和函数定义表达式都包含三部分:

  1. 函数名称标识符,即funcName,但二者对其要求不一样,声明语句是必须要的,而函数定义表达式则是可选的,通常是省略的。
  2. 一对圆括号()。
  3. 一对花括号{}。

所以上面两种形式其实是这样的:

  • 声明语句:function funcName(x){},  对于声明语句,实际上会声明一个funcName变量,并把函数对象赋值给它。
  • 函数定义表达式 :function funcName(x){},     函数定义表达式并没有声明一个变量,这里的funcName就是可选的(optional),(如果存在funcName,函数的局部作用域会包含一个绑定到该函数对象的名称,即funcName,funcName就指代函数对象,且值存在于函数体内部,也就是函数名就成为函数的一个局部变量.),通常函数定义表达式只适用于作为一个大的表达式的一部分:比如赋值,或者调用,所以就有了:var s = function funcName(x){};通常省略该函数名,即出现常见的 var s = function(x) {};  通常在递归时函数表达式的名称很有用,如

    var f = function fact(x){
        if(x <=1){
            return 1;
        }else {
            return x * fact(x-1);   //递归使用该函数
        }
    }

这两种定义方式都会创建一个新的函数对象。函数名实际上是一个指向该函数对象的指针,而不会与某个函数绑定。

意思就是呢,函数体就在那里,不会动,可以通过函数名来引用该函数进行操作,两者其实是相对独立,但又有着某种关系。看下面例子:

1 function sum(num1,num2){
2     return num1 + num2;
3 }
4 alert(sum(10,10));   //20
5
6 var anotherSum = sum;
7 alert(anotherSum(10,10));   //20
8 sum = null;
9 alert(anotherSum(10,10));    //20

这里的sum是函数名,可以通过sum引用到该函数,第6行将sum的值赋给anotherSum,这样anotherSum也可以访问到该函数体了,第8行将变量sum设为null,就是将它和函数体之间的关系切断,但函数体依然独立存在,不会受影响,从而anotherSum依旧可以引用到它,所以变量名就是一个指针而已。

理解完指针后,再来看看函数重载,EMACAScript里没有函数重载的概念,什么是重载呢?

 1 function addSomeNumber(num){
 2     return num + 100;
 3 }
 4 function addSomeNumber(num){
 5     return num + 300;
 6 }
 7 var result = addSomeNumber(100);  //400
 8 

//换一种方式:
 9 var addSomeNumber = function(num){
10     return num + 100;
11 };
12 addSomeNumber = function(num){
13     return num + 300;
14 };
15
16 var result = addSomeNumber(100);  //400

所以没有重载其实就是,覆盖函数引用,当创建了第二个函数体时,函数名就会指向新创建的函数体,从而覆盖之前引用的函数体,

函数声明与函数定义表达式的不同:

主要的不同是函数声明提前,有点像使用var 定义变量时,变量声明会提前,但初始化仍在原位置,但函数声明会让函数名和函数体都提前,将它们添加到执行环境中去,所以在声明该函数前就可以使用该函数。而函数定义表达式则不能提前,必须要执行到它后才会有效。

alert(sum(10,10));          //这里就声名提前了,
function sum(num1,num2){
    return num1 + num2;
}

alert(sum(10,10));           //这里就会出现错误
var sum = function(num1, num2){
    return num1 + num2;
};

二者的区别就是什么时候可以访问到函数。其他都是等价的。

12:45:22、、2016-01-10

时间: 2024-08-15 03:22:40

函数之定义的相关文章

js:深入函数的定义

函数定义方式: 1.function fun1(){alert("fun1");}  //函数就是一个非常特殊的对象,是一个Function的实例,其实在内存中存储的操作是通过一个键值对来存储的. 2.由于函数是一个对象,所以可以通过如下方式定义 var fun2 = fun1;  //通过函数拷贝给fun2完成赋值,但fun1.fun2这两个引用并没有指向同一个对象(虽然他们指向的对象的内容是一样的). fun1 = function(){alert("fun111&quo

内敛函数宏定义差别

内敛函数(inline函数) 内敛函数一般规模较小,程序再调用这些成员函数时.不是真正的运行函数的调用过程(如保存返回地址等处理).而是把函数代码嵌入程序的调用点(内敛函数在源文件里不是调用而是按原样展开),这样能够大大降低调用成员函数的时间. 类内定义的成员函数默认是内敛函数.由于在c++中一般将类定义放在头文件里.因此这些类内定义的函数也伴随着写入头文件里.函数声明一般在头文件里.而定义是不同意在头文件里的,由于他们要多次被编译. 若是内敛函数,则同意写在头文件里. 内敛函数的定义: 内联函

C++ 函数模板一(函数模板定义)

//函数模板定义--数据类型做参数 #include<iostream> using namespace std; /* 函数模板声明 1.函数模板定义由模板说明和函数定义组成,并且一个模板说明对应一个函数定义 2.模板说明的类属参数必须在函数定义中至少出现一次 3.函数参数表中可以使用类属类型参数,也可以使用一般类型参数 */ /* template关键字告诉c++编译器现在要进行泛型编程 typename或者class告诉c++编译器T是一个数据类型,不要进行语法检查 typename和c

C++ 回调函数的定义与用法

一回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函数)有何不同呢? 使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数. 而 那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作.至于如何定义回调函数,跟具体使用的 A

javascript 函数的定义与参数的有无

一.函数定义 function fName(params){ statements; return somevalue;//可以省略 } 注意事项: 1.参数可有,可无.不定义参数,在调用参数时,也可以传入参数: 例如: 1 function add(){ 2 if(arguments.length==1){ 3 alert(arguments[0]); 4 }else if(arguments.length==2){ 5 alert(arguments[0] + arguments[1] );

C/C++函数重复定义、头文件重复包含、互相包含问题

1.避免头文件重复包含 // test.h 此段宏的意思是如果定义了宏变量TEST_H_则不再定义它 #ifndef TEST_H_ #define TEST_H_ //头文件内容 #endif 或者 // test.h 告诉预编译器只包含一次 #pragma once 2.避免重复定义 不要将函数定义放置在头文件里面,正确的做法是头文件放置函数声明,源文件放置函数定义.因为源文件是分别编译的,假如头文件放置了函数定义,包含该头文件的每一个源文件都会定义相应的函数,从而导致重复定义.但是几种情况

Python函数的定义与使用

一.函数定义与基本应用 #!/usr/bin/env python3 '''#函数的定义.最基本的应用def MyFirstFunction(): a = 1+2 print(a) MyFirstFunction() #函数的执行First = MyFirstFunction #函数可以指向一个对象First()''' '''#函数的返回值(return).我们可以根据返回值来判断程序是否执行成功:如何函数中没有用retrun.返回值为None#邮件发送实例#函数中遇到retrun值后,后面的代

[java学习笔记]java语言基础概述之函数的定义和使用&amp;函数传值问题

1.函数 1.什么是函数? 定义在类中的具有特定功能的一段独立小程序. 函数也叫做方法 2.函数的格式 修饰符   返回值类型    函数名(参数类型  形式参数1, 参数类型  形式参数2-) {           执行语句(函数体);           return 返回值;       } 返回值类型:函数运行完成后输出的数据类型. 参数类型:是形式参数的数据类型. 形式参数:是一个变量,用于储存调用函数时传递给函数的实际参数. 实际参数:传递给形参的实际数据. return:结束函数

[Go语言]从Docker源码学习Go——结构和函数的定义

Docker在最近很火,而作为Docker的开发语言-Go也再次被大家提到. 已经使用Docker一段时间了,但是对于源码,尤其是其开发语言Go却一直是一知半解. 最近准备利用空余时间从Docker源代码入手来学习一下Go,同时对Docker的实现也希望可以提高一个层次. 有兴趣的可以一起讨论,学习. 准备工作: 1. Docker源代码https://github.com/docker/docker (版本1.1.2) 2. 安装开发工具LiteIDE, 这个是官方的Go语言的IDE 3. G

函数指针,回调函数的定义和使用

一.函数指针 定义:函数指针是指向函数的指针变量,即本质是一个指针变量. int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋给指针f */ 指向函数的指针包含了函数的地址,可以通过它来调用函数.声明格式如下:  类型说明符 (*函数名)(参数)其实这里不能称为函数名,应该叫做指针的变量名.这个特殊的指针指向一个返回整型值的函数.指针的声明笔削和它指向函数的声明保持一致.指针名和指针运算符外面的括号改变了默认的运算符优先级.如果没有圆括