JS复习—函数(函数的形参和实参没整理,函数的方法待补充,函数化编程待扩展)

函数

一、函数的定义

只定义一次,但可以被执行或调用任意次。JavaScript中函数是参数化的:函数的定义包括一个称为形参的标示符列表,这些参数在函数体中像局部变量一样工作。如果函数挂在在一个对象上,作为对象的一个属性,就称它为对象的一个方法。当通过这个对象来调用函数时,该对象就是此次调用的上下文,也就是该函数的this的值。用于初始化一个新创建的对象的函数称为构造函数。

二、函数的三种定义方式

1、函数声明:

函数声明语句实际上声明了一个变量,并把一个函数对象复制给它。

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

2、函数表达式

使用函数表达式可以无须对函数命名,从而实现动态编程。匿名函数,也成为拉姆达函数,是一种使用JavaScript函数的强大方式 。

特点:

(1)函数表达式不同于函数声明。函数声明要求有名字,但函数表达式不需要。没有名字的表达式也叫做匿名函数

(2)在无法确定如何引用函数的情况下,递归函数就会变得比较复杂

(3)递归函数始终调用arguments.callee来递归地调用自身,不要使用函数名-函数名可随时发生变化

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

如果一个函数声明表达式包含名称,函数的局部作用域将会包含一个绑定到函数对象的名称。这时函数的名称将成为函数内部的一个局部变量:如:递归调用

var f = function fact(x) { if (x<=1) return 1; else return x*fact(x-1); }

函数表达式特别适合定义那些只用一次的函数:

var tensquared = (function(x) { return x*x; }(10));

两种调用方式的区别:

尽管函数声明语句和函数定义表达式包含相同的函数名。但是两者仍然不同。。两种方式都创建新的函数对象,但函数声明语句中国的函数名是一个变量名,变量指向函数对象。和通过var声明变量一样,函数定义语句被显示地“提前”到了脚本或函数体的顶部。因此它们呢在真个脚本和函数体内都是可见的。使用var的话,只有变量声明提前了—变量初始化代码仍然留在原来的位置。然而使用函数声明语句的话,函数名称和函数体都提前。也就是说,可以声明一个JavaScript函数之前调用它。

3、构造函数

不管通过函数定义语句还是函数直接量表达式,函数的定义都要使用function关键字,单函数还可以使用Function()构造函数来定义。Function()构造函数可以传入任意数量的字符串实参,最后一个实参所表示的文本就是函数体;它可以包含任意的JavaScirpt语句,每两条语句之间用分号分开。

注意: Function()构造函数并不需要传入实参以指定函数名。就像函数直接量一样,Function()构造函数创建一个匿名函数。

var f = new Function("x" ,"y", "return x*y;" );
var f = funciton(x,y) { return x*y; }

、构造函数和普通函数

构造函数与其他函数的唯一区别,就在于调用它们的方式不同。不过,构造函数毕竟也是函数,不存在定义构造函数的特殊语法。任何函数,只要通过new操作符来调用,那它就可以当做构造函数;任何函数,只要不通过new操作符来调用,那它和普通函数没有任何区别。

function Person(name,age,job) {
     this.age = age;
     this.name = name;
     this.job = job;
}

1、普通函数

Person("Greg", 27 ,"Doctor");   //添加到windows

2、构造函数

var person = new Person("Nicholas", 29, "Software Engineer");

new操作符具体做了什么事情:

(1)创建一个新的对象

(2)将构造函数的作用域赋给新对象(因此this就指向这个新对象);

(3)执行构造函数的代码(为这个新对象添加属性);

(4)返回新对象

四、return语句

return语句导致函数停止执行,并返回它的表达式给调用者,如果没有与之相关的表达式,则返回undefined

五、函数特性     

特性:声明提前

Javascript函数里的声明的所有变量都被"提前"至函数体的顶部

六、函数的调用

1、作为函数

printprop({x:1});

2、作为方法

作为方法调用和函数调用有一个重要的区别,即(调用上下文this),函数体里可以用this引用该对象。

注意:

方法和this关键字是面向对象编程范例的核心。任何函数只要作为方法调用实际上都会传入一个隐式的实参(this)—这个实参是一个对象。需要注意的是,this是一个关键字,不是变量,也不是属性名。关键字this没有作用域限制,嵌套的函数不会从调用它的函数中继承this。如果嵌套函数想要访问外部函数的this,需要将this的值保存在一个变量里,这个变量和内部函数都同在一个作用域内。通常用变量self来保存this .

3、作为构造函数

构造函数可以使用this关键字来引用这个新创建的对象

4、通过他们的call()和apply()方法调用

七、闭包

1、定义:闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的方式,就是在一个函数内部创建另一个函数。函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为“闭包。”从技术角度讲, 所有

JavaScript函数都是闭包。

2、原理:在后台环境中,闭包的作用域链包含着它自己的作用域、包含函数的作用域和全局作用域。通常,函数的作用域及其所有变量都会在函数执行结束被销毁。但是,当函数返回一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止。

3、应用:在匿名函数和闭包一文中有写到

4、缺点

(1)于闭包里作用域返回的局部变量资源不会被立刻销毁回收,所以可能会占用更多的内存。过度使用闭包会导致性能下降,建议在非常有必要的时候才使用闭包。

(2)同一个作用域链中定义的多个闭包,共享同样的私有变量或变量。当书写循环代码时,往往会出错。由于作域链的机制导致一个问题,在循环中里的匿名函数取得的任何变量都是最后一个值

八、常用的属性和方法

1、属性

     length:  函数形参的长度

arguments.length: 函数实参的长度

prototype:这个属性是指向一个对象的引用 ,这个对象称为"原型对象"。每一个函数都包含不同的原型对象。当将函数用作构造函数的时候,新创建的对象将会从原型对象上继承属性。

2、方法

call()

apply()

bind()

toString()

九、自定义函数属性

JavaScript中的函数并不是原始值,而是一种特殊对象。也就是说,函数可以拥有属性。

当函数需要一个"静态"变量来保持某个值不变,最方便的方式就是给函数定义属性,而不是定义一个全局变量。比如,假设你想写一个返回一个唯一整数的函数,不管到哪里调用函数都会返回这个整数,而且这些值得信息需要在不同的函数调用过程持久化。可以将这些信息放到全局变量中,但这并不是必须的,因为这个信息仅仅是函数本身用到。最好将这个信息保存到函数对象的一个属性中。

十、函数式编程 

JavaScript并非函数式编程语言,但在JavaScript中可以像操控对象一样操控函数,也就是说可以在JavaScript中应用函数式编程技术。

例如:求数字的平均值和标准差

var sum = function(x,y) {
	return x+y;
};
var square = function(x) {
	return x*x;
};

var data = [1,1,3,5,5];
var mean = data.map(function(x) { return x-mean; });
var deviations = data.map(function(x) {return x-mean;});
var stddev = Math.sqrt(deviations.map(square).reduce(sum)/(data.length-1));

  

  

时间: 2024-10-10 08:18:26

JS复习—函数(函数的形参和实参没整理,函数的方法待补充,函数化编程待扩展)的相关文章

Pyhton函数篇(一)之函数中的形参与实参

1:什么是函数 函数其实就是带名字的代码块,用于完成一些具体的工作.如果我们在写一段程序的时候,需要多次用到同样的一个功能,如果每次都要重复写相同的代码,不仅会增加我们的代码量,更会让我们写出的代码让别人看起来觉得很low,而如果我们把功能作为一个代码块封装在一个函数里,每次仅需要调用这个函数,是不是就很方便了?这就是函数的意义所在 1.1 函数的定义方式 函数的定义使用def关键字,如下: def user(): def 关键字后面加函数名定义函数,定义以冒号结尾 """内

C语言中函数声明、形参、实参

函数原型: 原型prototype是函数的声明:描述了函数的返回值与参数: 函数原型说明了两点: 1.该函数的返回值 2.该函数的参数及其类型 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 函数的参数: 参数到底是什么:传递给函数的信息称为参数. 如果一个函数不接受任何参数的话,函数头的圆括号中应该写关键字void. 如果函数接受一个int类型的变量,则可以如下声明一个函数原型: void func (int n) 函数返回值类

(一)Python入门-5函数:02形参和实参-文档字符串-函数注释-返回值详解

一:形参和实参 [操作]定义一个函数,实现两个数的比较,并返回较大的值. 1 def printMax(a,b): 2 '''实现两个数的比较,并返回最大值!''' 3 if a >b: 4 print(a,'较大值') 5 else: 6 print(b, '较大值') 7 8 printMax(20,30) 9 printMax(30,5) 10 11 #测试文档字符串的使用 12 help(printMax) 13 help(printMax.__doc__) 上面的 printMax 函

关于Java中形参与实参的理解

今天阅读了一个写的非常棒的博文,通过此博文再次复习了Java中参数传递的知识(即值传递与引用传递的区别).参考网站http://www.cnblogs.com/binyue/p/3862276.html.下面我将通过次博文记录自己的理解,还望能够帮助再学Java或者复习Java的朋友们. 一.基本类型与引用类型在内存中的保存内容 Java中的变量分为基本类型和引用类型两种.基本类型的变量保存数值本身,而引用类型的变量保存的是引用值,即指向内存空间的地址. 基本类型包括:byte,char,int

JavaScript中函数的形参和实参的实现原理剖析

我们都知道JS里面参数的传递是可以不一样的,比如我们有一个函数: <script type="text/javascript"> function one(a,b,c) { this.x = a; console.log(a); } one(1); </script> 我们传递的数字只有一个1,但是形参那里有abc三个.这分明对不上啊不是吗? 这个时候如果我们查看b,c的话会显示undefined.ps:比如console.log(b). 当然啦,本来就没有这两

函数的形参与实参

在函数中,形参不是必须的 1 function fn(){ 2 console.log(arguments[0]+arguments[1]); >>11 3 console.log(arguments.length); >>2 4 console.log(arguments); >>[10, 1] 5 } 6 fn(10,1); arguments是一个类似数组的函数,但它仅仅也只是类似,并不是真的数组.从上面的代码中我们可以看到我并没有使用形参,但是达到了同样的效果.

C语言形参与实参的概念及swap函数

形式参数(formal argument)和实际参数(actual argument)是什么? void function(int n); //n为形式参数 int main { int times=5; function(times); //times为实际参数 } void function(int n) { for(int i=0;i<n;i++) printf("hello\n"); } 在声明一个参数时就创建了一个叫形式参数的变量,在上面的例子中形式参数是叫做n的变量.

参数传递:传值参数,指针形参,传引用参数,const形参和实参,数组形参,main:处理命令行选项,含有可变形参的函数

重点: 1.每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化. NOTE: 形参初始化的机理与变量初始化一样. 2.形参的类型决定了形参和实参交互的方式. (引用->绑定,非引用->拷贝) 3.实参分为:被引用传递(引用形参是实参的别名),被值传递(实参形参是两个相互独立的对象). 4.传值参数:函数对形参做的所有操作都不会影响实参. 5.指针形参:指针的行为和其他非引用类型一样,当执行指针拷贝操作时,拷贝的是指针的值.拷贝后,两个指针是不同的指针. NOTE: C程序员常常

关于python函数形参、实参和变量作用域的分析

大家都知道,程序代码行数一旦到一定程度,给变量.函数.类起名字是个头疼的问题.尤其函数还有形参.实参的问题. 这里面很容易产生引用错误,作用域错误的问题.看下面的例子: def test(a): a = 20 print("这是在调用函数之时的值: %s"%a)a = 10print("这是在调用函数之前的值: %s"%a)test(a)print("这是在调用函数之后的值: %s"%a) 运行结果: 这是在调用函数之前的值: 10 这是在调用函