JavaScript基础学习之-JavaScript权威指南--8.1-8.4函数

第八章函数

函数是JavaScript中很重要的一个章节,懂得这个章节就可以轻松阅读别人的代码,会熟悉一些不常用的代码写法。
按照难易程度控制文章的长度。

前言:

函数是一段只定义一次,可能被执行或调用任意次的JavaScript代码。

若一个函数挂载在一个对象上,作为对象的属性,称为对象的方法。当通过这个对象来调用函数时,该对象就是此次调用的上下文,函数会隐式自动获得上下文对象。

JavaScript中函数即对象,程序可以任意操控。

JavaScript的函数可以嵌套在其他函数中定义,这样嵌套的函数可以访问外层函数作用域中的任何变量。这意味着JavaScript函数构成一个闭包。

8.1函数定义

1、 函数特征:

 1. 函数名--可选
 2. function
 3. ()
 4.  {}

2、函数定义方法

  1. 函数语句
  2. 表达式

    1.函数语句就是普通的function funname(){}
    备注:使用函数时必须在函数定义之后或是提前声明。
    2.表达式就是var variable = function(){}
    备注:使用必须是变量已经声明。
    “=”右边的函数就是一个匿名函数,创造完毕函数后,又将该函数赋给了左边变量。

3、函数命名

普通函数 内部函数,私有函数
like_this() _like_this()
likeThis();  

使用短名称,或是使用符号重命名。

8.2函数调用

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

闭包实现的原理是将内部引用赋给外部变量,利用外部变量永久保存对内部变量的引用,不会被垃圾回收机制处理掉。
时间: 2024-10-11 06:04:28

JavaScript基础学习之-JavaScript权威指南--8.1-8.4函数的相关文章

JavaScript基础学习之-JavaScript权威指南--3.1数字

数字 JavaScript不区分整数和浮点数,所有数字都是浮点数. 数字前加负号就得到相反数. 3.1.1整形直接量 十六进制:0X或是0x 不做标记:十进制 八进制:0 备注:某写JavaScript支持八进制. 3.1.2浮点型直接量 1.2E-3  =  1.2 * 10 的负3次 3.1.3算术运算 溢出:运算结果超出了数字能表示的结果,有上溢和下溢. 下溢:运算结果无限接近0. 0做除数:结果是无穷大或是负无穷大. 0/0 NaN 无穷大/无穷大 NaN 负数开方 NaN 不是数字或是

JavaScript基础学习之-JavaScript权威指南-3.4null和undefined

null和undefined比较 null是JavaScript关键字,表示非对象. undefined表示没有值,说明这个值不存在或是没有初始化. 相同点 不同点 自有类型唯一值 null是对象,undefined是保留字 没有属性和方法 null在参与数学运算中转化成0,undefined在数学运算中无法转化或是转化成NaN ==认为相等,===认为不等 null !==undefined //true 都是假值,在布尔值变量表示值相同 null是空对象,undefined是window的属

JavaScript基础学习之-JavaScript权威指南-3.6包装对象

JavaScript对象是一种复合值,是已知属性或是命名值的集合. 我们看到字符串也同样有属性和方法. var s = "Test"; var len=s.length; 我们知道在JavaScript中像上面这样声明的字符串不是对象,但既然这里的s不是对象,为什么会有length的属性呢? 原因是在JavaScript中只要引用了字符串(数字.布尔值也是一样的)的属性,JS就会将字符串通过调用new String(s)的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引

JavaScript基础学习之-JavaScript权威指南-3.5全局对象

全局对象 全局对象的属性可以直接用. JavaScript解释器启动或是任何web浏览器加载新页面的时候,都会创建新的全局对象,并给它一组定义的初始属性: 构造函数 描述 Date 日期对象 RegExp 正则表达式对象 String 字符串对象 Object object对象 Array 数组对象 全局对象 描述 Math 数学类计算 JSON json 全局函数 描述 decodeURI() 解码某个编码的 URI. decodeURIComponent() 解码一个编码的 URI 组件.

JavaScript基础学习之-JavaScript权威指南--3.8.3对象转换成原始值

对象转换成原始值 对象到布尔:比较简单所有对象到布尔都是true,包括包装类new Boolean(false)是一个对象而不是原始值,它将转换为true 对象到数字,对象到字符串比较复杂一些.注意这里讨论的是本地对象,不包含宿主对象(例如浏览器定义的对象) 所有对象继承了两个转换方法. 第一种toString() 它的作用是返回一个反映这个对象的字符串.默认的toString()方法并不会返回一个有趣的值. 很多类定义了特定版本的toString()方法: 数组的toString()方法将每个

JavaScript基础学习之-javascript权威指南--8.6函数闭包

一.什么是闭包? 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 相信很少有人能直接看懂这句话,因为他描述的太学术. 其实这句话通俗的来说就是:JavaScript中所有的function都是一个闭包.不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”.看下面这段代码: function a() { var i = 0; function b() { alert(++i); } r

JavaScript基础学习之-JavaScript权威指南--8.7函数属性方法构造函数

函数属性.方法和构造函数 一.函数属性 函数是js中特殊的对象,可以拥有属性. funcation.length属性:代表形参的长度,只读属性,不允许更改 arguments.length代表的是实参长度 prototype属性:每个函数都有一个prototype属性,当把函数当做构造函数时,新创建的对象会从原型对象上继承属性. 二.函数方法 与其他语言不同,ECMAScript函数不介意传递进来多少个参数,也不在乎是什么类型.因为实参在内部是用一个类数组来表示的,函数接收到的始终是个类数组.

JavaScript基础学习之-JavaScript权威指南--3.2文本

文本 字符串是16位值组成的不可变的有序序列. 字符串的长度是16位值的个数. 3.2.1字符串直接量 字符串直接量:单引号或是双引号里的内容. ECMA3中字符串必须写在一行中. ECMA5中可以用"\"拆分很多行.

javascript基础学习(十五)

javascript之cookie 学习要点: cookie介绍 创建与获取cookie cookie的编码 cookie的生存期 cookie的路径 cookie的domain cookie的secure 一.cookie介绍 cookie实际上就是一些信息,这些信息以文件的形式存储在客户端计算机上.在javascript中,cookie主要用来保存状态,或用于识别身份. 二.创建与获取cookie 创建cookie的语法代码如下所示:document.cookie="name=value&q