JavaScript基础学习之-JavaScript权威指南第八章--函数
来源:互联网 发布:用户 访问 网站 数据 编辑:程序博客网 时间:2024/05/18 02:14
函数是JavaScript中很重要的一个章节,懂得这个章节就可以轻松阅读别人的代码,会熟悉一些不常用的代码写法。
按照难易程度控制文章的长度。
前言:
函数是一段只定义一次,可能被执行或调用任意次的JavaScript代码。
若一个函数挂载在一个对象上,作为对象的属性,称为对象的方法。当通过这个对象来调用函数时,该对象就是此次调用的上下文,函数会隐式自动获得上下文对象。
JavaScript中函数即对象,程序可以任意操控。
JavaScript的函数可以嵌套在其他函数中定义,这样嵌套的函数可以访问外层函数作用域中的任何变量。这意味着JavaScript函数构成一个闭包。
8.1函数定义
1、 函数特征:
1. 函数名--可选 2. 、function 3. () 4. {}
2、函数定义方法
- 函数语句
表达式
1.函数语句就是普通的function funname(){}
备注:使用的函数必须在函数定义之后或是提前声明。
2.表达式就是var variable = function(){}
备注:使用必须是变量已经声明。
“=”右边的函数就是一个匿名函数,创造完毕函数后,又将该函数赋给了左边变量。
3、函数命名
1.动词开头,public
like_this();
likeThis();
2.内部函数,私有函数
like
3.使用短名称,或是重命名
8.2.1函数调用
若函数返回是因为解释器到达结尾,则返回值是undefined。
==若return语句没有值,也是返回undefined。
以函数方式调用通常不能使用this关键字。
严格模式下函数中的this是undefined,非严格模式下是全局对象
8.2.2方法调用
一个方法就是保存在一个对象属性中的函数。
方法和函数最大的区别就是调用上下文。函数只有全局变量和undefined两种,方法时根据调用的对象来确定上下文的。
this是一个关键字不是变量,也不是属性名,不允许对this赋值。
关键字this没有作用域的限制,嵌套函数不会从调用它的函数中继承this。
若嵌套函数作为方法调用,this指向调用它的对象。若嵌套函数作为函数调用,其this值是全局对象(非严格模式),或undefined(严格模式下)
8.2.1和8.2.3实际上是对之前8.1提出来的两种定义函数的方法的分别调用详述。
8.2.3构造函数调用
显示返回新对象
没有形参的构造函数可以省略()
8.3 函数的实参和形参
8.3.1可选的形参
对参数做检查,如果没有的话就使用新对象
当调用函数的时候传入的实参比函数声明时指定的形参个数要少时,剩下的形参都将设置为undefined值。
8.3.2可变长的实参列表:实参对象
当调用函数传入的实参个数超过形参个数时,没办法直接获得未命名的引用。在函数内,标示符arguments是指向实参对象的引用,其是一个类数组对象。
arguments 对象,传参随便传多少个参数,接受的时候使用arguments对象以数组的方式获得。
ECMA5已经移除了实参对象。
严格模式下无法使用arguments作形参变量名或是局部变量名,也不能赋值。
非严格模式是作为标识符
函数可以接受任意个数的实参,这种函数称为不定实参函数,arguments[]适合实现这种场景的函数。
arguments并不是真正的数组,是一个实参对象,修改其值可以相应修改传入的实参。
8.3.3将对象属性用作实参
使用实参对象+键值对的方式免去记忆参数的位置
8.3.4实参类型
在函数内部做类型检查和处理
8.4作为值的函数
在JavaScript最顶层代码,作用域链由一个全局对象组成。
在不包含嵌套函数体内,作用域上有两个对象,第一个是定义函数参数和局部变量的对象,第二个是全局对象。
当定义一个函数时,它实际上至少保存一个作用域链。
当调用这个函数时,它创建一个新的对象来存储它的局部变量,并将这个对象添加至保存的那个作用域链上,同时创建一个新的更长的作用域链。
当函数返回的时候,就从作用域链中将这个绑定的变量对象删除。若不存在嵌套函数,也没有其他引用指向这个绑定的对象,则会把垃圾回收。
对于嵌套函数,每次调用外部函数时,内部函数又会重新定义一遍。因为每次调用外部函数的时候,作用域都不同的。
内部函数在每次定义的时候都有微小的差别,在每次调用外部函数时,内部函数代码相同,而关联这段代码的作用域链不相同。
嵌套函数不会将作用域内私有成员复制一份,也不会对所绑定的变量生成静态快照。
counter(){ > var n=0; > return { > count: function(){ return n++;}, > reset: function(){ n=0;} > }; > } //每次调用counter都会创建一个新作用域链和一个新的私有变量 var >c=counter(),d=counter(); >c.count(); //-->1 >d.count();//-->1 >d.count();//-->2闭包实现的原理是将内部引用赋给外部变量,利用外部变量永久保存对内部变量的引用,不会被垃圾回收机制处理掉。
- JavaScript基础学习之-JavaScript权威指南第八章--函数
- JavaScript基础学习之-JavaScript权威指南--第八章函数属性方法构造函数
- JavaScript基础学习之-javascript权威指南--第八章函数闭包
- JavaScript权威指南:函数(第八章)
- JavaScript权威指南_第八章:函数
- JavaScript权威指南学习之第8章 函数
- 读《javascript权威指南> 》第五版 第八章 函数
- JavaScript权威指南读书笔记——第八章 函数
- JavaScript基础学习之-JavaScript权威指南--第一章解释器
- JavaScript基础学习之-JavaScript权威指南-第三章类型、值和变量
- JavaScript基础学习之-JavaScript权威指南-第二章词法结构
- JavaScript基础学习之-JavaScript权威指南-第三章类型、值和变量(2)
- 《Javascript权威指南》学习笔记之六:自定义函数
- 《Javascript权威指南》学习笔记之六:自定义函数
- javascript权威指南学习
- JavaScript权威指南学习之第2章 词法结构
- JavaScript权威指南学习之第5章 语句
- JavaScript权威指南学习之第6章 对象
- C#----汉字转拼音
- 计蒜客 难题题库 017 X的平方根
- 递归实现集合全排列
- 计蒜客 难题题库 018 跳跃游戏
- 多功能图片压缩工具 类
- JavaScript基础学习之-JavaScript权威指南第八章--函数
- 【C/C++】浅谈C/C++之深浅拷贝
- 网页设计基础知识总结
- ORACLE 第7节 创建和管理表
- 矩阵乘裸题
- Android Framework 记录之一
- css3子选择器
- 计蒜客 难题题库 019 加一
- Keepalived 在openstack的实施