函数的基本语法如下所示:

function functionName(arg0, arg1,...,argN) {

statements

} 函数如果有返回值则return 后的语句将不会被执行,返回值可以直接在return语句中实现,没有return返回的undefined

函数中的参数:

1.函数中不介意传递的参数个数和参数的类型,函数中的参数其实是一个数组,可以通过arguments 来访问参数

2.函数中的参数不能重载,ECMAScript 中定义了两个名字相同的函数,则该名字只属于后定义的函数

Function类型

函数实际上是Function类型的实例,函数名相当于只想函数对象的指针,它与其他引用类型一样有属性和方法。

由于函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没有什么不同。函数作为另一个函数的参数或者另一个函数的返回值(函数的嵌套)换句话

说,一个函数可能会有多个名字,如下面的例子所示。

function sum(num1, num2){

return num1 + num2;

}

alert(sum(10,10)); //20

var anotherSum = sum;

alert(anotherSum(10,10)); //20

sum = null;

alert(anotherSum(10,10)); //20

FunctionTypeExample01.htm

以上代码首先定义了一个名为sum()的函数,用于求两个值的和。然后,又声明了变量anotherSum,

并将其设置为与sum 相等(将sum 的值赋给anotherSum)。注意,使用不带圆括号的函数名是访问函

数指针,而非调用函数。此时,anotherSum 和sum 就都指向了同一个函数,因此anotherSum()也

可以被调用并返回结果。即使将sum 设置为null,让它与函数“断绝关系”,但仍然可以正常调用

anotherSum()。ECMAScript 中的函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。

函数声明三种方法:

function sum (num1, num2) {

return num1 + num2;

}

函数表达式声明

var sum = function(num1, num2){

return num1 + num2;

};

一种定义函数的方式是使用 Function 构造函数。Function 构造函数可以接收任意数量的参数,

但最后一个参数始终都被看成是函数体,而前面的参数则枚举出了新函数的参数。来看下面的例子:

var sum = new Function("num1", "num2", "return num1 + num2"); // 不推荐

函数表达式和函数声明的比较

函数声明提升:在函数执行前,解析器会先读取函数的声明 ,再调用相应函数

函数内部的对象:this(函数执行环境的对象),arguments(类数组对象,保存函数的参数)

函数内部的属性length:函数中接受参数的个数,prototype

函数内部的方法:apply ()和call()

。这两个方法的用途都是在特定的作

用域中调用函数,实际上等于设置函数体内this 对象的值。首先,apply()方法接收两个参数:一个

是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是Array 的实例,也可以是

arguments 对象。例如:

function sum(num1, num2){

return num1 + num2;

}

function callSum1(num1, num2){

return sum.apply(this, arguments); // 传入arguments 对象

}

function callSum2(num1, num2){

return sum.apply(this, [num1, num2]); // 传入数组

}

alert(callSum1(10,10)); //20

alert(callSum2(10,10)); //20

在严格模式下,未指定环境对象而调用函数,则this 值不会转型为window。

除非明确把函数添加到某个对象或者调用apply()或call(),否则this 值将是

undefined。

apply()和call()真正的用武之地;它们真正强大的地方是能够扩充函数

赖以运行的作用域

匿名函数: 创建的 函数赋值给变量

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

http://www.cnblogs.com/rainman/archive/2009/05/04/1448899.html

(全局变量会保存在内存中,局部变量函数执行后会被销毁) 区分好全局和局部

闭包:闭包是指有权访问另一个函数作用域中的变量的函数(函数嵌套)。由于闭包会携带包含它的函数的作用域,),作用域链终点的全局执行环境 作用:可以在函数外部读取函数内部的局部变量,另一个就是让这些变量的值始终保持在内存中。(即闭包指的是函数嵌套中的内部函数所以这些变量指外部函数中包含的变量)

因此会比其他函数占用更多的内存

闭包副作用:,即闭包只能取得包含函数中任何变量的最后一个值

function createFunctions(){

var result = new Array();

for (var i=0; i < 10; i++){

result[i] = function(){

return i;

};

}

return result;

}//都是返回10

function createFunctions(){

var result = new Array();

for (var i=0; i < 10; i++){

result[i] = function(num){

return function(){

return num;

};

}(i);

}

return result;

}//1,2,3…..10

递归函数(一个函数通过名字调用自身

function factorial(num){

if (num <= 1){

return 1;

} else {

return num * factorial(num-1);

}

}

。虽然这个函数表面看来没什么问题,但下面的代码却可能导致它出错。

var anotherFactorial = factorial;

factorial = null;

alert(anotherFactorial(4)); //出错!

arguments.callee 是一个指向正在执行的函数的指针,因此可以用它来实现对函数

的递归调用

function factorial(num){

if (num <= 1){

return 1;

} else {

return num * arguments.callee(num-1);

}

在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致错误。不过,可

以使用命名函数表达式来达成相同的结果。例如:

var factorial = (function f(num){

if (num <= 1){

return 1;

} else {

return num * f(num-1);

}

});

js 函数总结的更多相关文章

  1. 3.3 js函数

    1.函数语法: 函数声明的方式:function 函数名(参数1,参数2-){//函数体;}函数调用:函数名(参数1,参数2-); 函数内不一定都指定返回值. 如果需要指定返回值,可用 return ...

  2. Js函数function基础理解

    正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...

  3. js函数表达式和函数声明的区别

    我们已经知道,在任意代码片段外部添加包装函数,可以将内部的变量和函数定义"隐 藏"起来,外部作用域无法访问包装函数内部的任何内容. 例如: var a = 2; function ...

  4. 通用js函数集锦<来源于网络> 【二】

    通用js函数集锦<来源于网络> [二] 1.数组方法集2.cookie方法集3.url方法集4.正则表达式方法集5.字符串方法集6.加密方法集7.日期方法集8.浏览器检测方法集9.json ...

  5. 通用js函数集锦<来源于网络/自己> 【一】

    通用js函数集锦<来源于网络/自己>[一] 1.返回一个全地址2.cookie3.验证用户浏览器是否是微信浏览器4.验证用户浏览器是否是微博内置浏览器5.query string6.验证用 ...

  6. 100多个基础常用JS函数和语法集合大全

    网站特效离不开脚本,javascript是最常用的脚本语言,我们归纳一下常用的基础函数和语法: 1.输出语句:document.write(""); 2.JS中的注释为//3.传统 ...

  7. JS函数

    1.document.write(""); 输出语句2.JS中的注释为//3.传统的HTML文档顺序是:document->html->(head,body)4.一个浏 ...

  8. js函数和运算符

    函数是由事件驱动或者它被调用时执行可重复使用的代码块. <script> function myFunction(){ Alert(“hello World!”): } </scri ...

  9. JavaScript学习03 JS函数

    JavaScript学习03 JS函数 函数就是包裹在花括号中的代码块,前面使用了关键词function: function functionName() { 这里是要执行的代码 } 函数参数 函数的 ...

  10. JSF页面中使用js函数回调后台bean方法并获取返回值的方法

    由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的, ...

随机推荐

  1. navicat使用

      navicat我觉得做程序的基本上都会用,它方便,快捷,直观等,优点很多,这也是我写这篇文章的原因.以前我基本上都是用phpmyadmin,也挺好用,不过也有不少缺点,比如数据库备份文件太大,根本 ...

  2. chrome浏览器 模拟访问移动端

    谷歌Chrome浏览器,可以很方便地用来当3G手机模拟器.在Windows的[开始]-->[运行]中输入以下命令,启动谷歌浏览器,即可模拟相应手机的浏览器去访问3G手机网页: 谷歌Android ...

  3. Spring 异常:Error creating bean with name

    异常信息:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxx' 我今 ...

  4. 一起来做chrome扩展《可配置的代理》

    一.本文主要涉及相关内容: chrome.proxy pacScript browser_action popup localStroage 二.预览 (代理运行截图,图中的代理服务器有防火墙,暂不对 ...

  5. 微信小程序时代已经来临

    昨天估计微信公众号上产生了第一篇最快的30万+文章,10万+只花了10多分钟.就是冯大辉(著名Oracle专家,知名博主)同学的「微信应用号来了」. 为什么这么一篇如此简单又技术类的文章一下能刷遍朋友 ...

  6. 开发者所需要知道的 iOS 10 SDK 新特性

    转自:https://onevcat.com/2016/06/ios-10-sdk/ 写的很好啊.哈哈哈 总览 距离 iPhone 横空出世已经过去了 9 个年头,iOS 的版本号也跨入了两位数.在我 ...

  7. sprint3总结

    经过了半个学期以来的sprint冲刺,并且充分学习了android开发后对项目有了更加充分的认识理解,开发速度自然而然就上来了,没有了上一个学期的懵懂,虽然开发起来还是比较困难,但是胜在有同组组员帮忙 ...

  8. manifest中读取<meta-data>

    meta-data在清单文件中主要有以下用法: <application>       <meta-data android:value="a1" android ...

  9. JMeter学习-022-JMeter 分布式测试(性能测试大并发、远程启动解决方案)

    在使用 JMeter 进行性能测试时,难免遇到要求并发请求数比较的场景,此时单台测试机的配置(CPU.内存.带宽等)可能无法支持此性能测试场景.因而,此时 JMeter 提供的分布式测试功能就有了用武 ...

  10. wp8.1 VS2013部署手机发生 DEP6100 6200错误

    wp8.1 VS2013部署手机发生 DEP6100 6200错误 ,提示未发现手机. 可能是数据线有问题 建议更换 本人的电脑有很多次,提示DEP6100 6200错误,每一次都需要重做系统.. 然 ...