廖雪峰JS学习总结-函数篇

最近在刷廖雪峰的JS教程,把里面的自己不太清楚的东西在刷一遍。
教程网址:http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000

函数的定义和调用:

  1. 如果没有return语句,函数执行完毕后也会返回结果,只是结果为undefined
  2. JavaScript允许传入任意参数,即使函数内部不需要这些参数,也不影响调用。
  3. JavaScript还有一个免费赠送的关键字arguments,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。arguments类似Array但它不是一个Array
  4. 利用arguments即使函数不定义任何参数,还是可以拿到参数的值。
function abs() {
    if (arguments.length === 0) {
        return 0;
    }
    var x = arguments[0];
    return x >= 0 ? x : -x;
}
abs(); // 0
abs(10); // 10
abs(-9); // 9
  1. ES6引入了新的rest参数,他可以获得额外的rest参数,rest参数只能写在最后,前面用...标识,从运行结果可知,传入的参数先绑定a、b,多余的参数以数组形式交给变量rest,所以,不再需要arguments我们就获取了全部参数。(如果传入的参数连正常定义的参数都没填满,也不要紧,rest参数会接收一个空数组(注意不是undefined))
function foo(a, b, ...rest) {
    console.log('a = ' + a);
    console.log('b = ' + b);
    console.log(rest);
}
foo(1, 2, 3, 4, 5);
// 结果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]
foo(1);
// 结果:
// a = 1
// b = undefined
// Array []
  1. return语句必须在一行上,如果必须为多行返回,需要在retrun后紧跟 {,正确的多行写法如下:
function foo() {
    return { // 这里不会自动加分号,因为{表示语句尚未结束
        name: 'foo'
    };
}

变量作用域:

  1. 如果用var在函数体内声明变量,该变量作用域为整个函数;因为这个原因,在不同函数内部用var申明的同名变量互相独立,互不影响。
  2. 由于函数可以相互嵌套,内部函数可以访问外部函数定义的变量,但是如果内部和外部都定义了同名变量怎么办了?JS函数查找变量会从自身定义函数开始,也就是从’内’向’外’,顺着作用域链查找,如果内部函数已经定义了,则会’屏蔽’掉外部函数变量。
  3. JS函数的var定义有个特点,它会先扫描整个函数体的语句,把所有var申明的变量“提升”到函数顶部,所以定义变量时,我们应该严格遵守在函数内部先声明的规则。
  4. JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性上了。
  5. 为了防止造成命名冲突,比较好的方法是把自己的所有变量和函数,都绑定到一个全局变量中:
// 唯一的全局变量MYAPP:
var MYAPP = {};
// 其他变量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
// 其他函数:
MYAPP.foo = function () {
    return 'foo';
};
  1. 在for循环是无法定义具有局部作用域的的变量的。在ES6中可以使用let替代var可以申明一个块级作用域的变量。
  2. 对于常量的定义,以前都是使用全部大写来规定,现在ES6总可以使用关键字const来定义常量,constlet都具有块级作用域,并且const定义以后无法修改。
  3. 补充说明一下letconst的特点,不存在变量提升、会造成暂时性死区、不允许重复定义。

方法:

在一个对象中绑定函数,称为这个对象的方法。这里要介绍一个很坑爹的概念,就是this的指向问题。

那么对于不同的调用,这个this的指向分别是什么了??
答:this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象。
在《javascript语言精髓》中大概概括了4种调用方式:
1. 方法调用模式
2. 函数调用模式
3. 构造器调用模式
4. apply/call调用模式
特别补充:

  1. 在构造器调用时,如果加入了return并且return了一个对象,this会指向这个return的对象。
  2. 严格模式下在函数内部定义的函数,this指向undefined(在非strict模式下,它指向全局对象window

那么有没有办法去控制this的指向了?
有的,可以使用函数本身的apply方法,它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。另一个与apply()类似的方法是call(),唯一区别是:

  • apply()把参数打包成Array再传入;
  • call()把参数按顺序传入。
    另外ES5还加入了一个bing()方法,它会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。

利用apply(),我们还可以动态改变函数的行为。
JavaScript的所有对象都是动态的,即使内置的函数,我们也可以重新指向新的函数。

高阶函数:

  1. 一个函数接收另一个函数作为参数,这种函数就称之为高阶函数。
  2. forEach方法,是最基本的方法,就是遍历与循环,默认有3个传参:分别是遍历的数组内容item、数组索引index、和当前遍历数组Array。另外,除去第一个必须的回调函数参数,还可以接受一个上下文参数(改变回调函数的this指向);并且forEach不会遍历空元素。
  3. map方法,基本用法与forEach一致,但是不同的,它会返回一个新的数组,所以在callback需要有return值,如果没有,会返回undefined。(从字面理解,map就是映射的意思)
  4. filter方法,用法和map很相似,从字面理解,就是过滤、筛选的意思。但是函数的callback需要返回布尔值truefalse,并且返回值只需要为弱等==即可。
  5. some 方法,对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true。(一旦遇到true,就会中断循环,返回true,类似于||判断)
  6. every方法,对数组中的每一项运行给定函数,如果该函数对每一项返回true,则返回true。(一旦遇到false,就会中断循环,返回false,类似于&&判断)
  7. sort方法,默认把所有元素先转换为String再进行ASCII码排序,所以这个很坑爹。要想正确的排序,需要添加一个函数。sort方法,可以接受一个回调函数,默认有两个传参:分别是比较的数组项。

闭包:

「闭包」,是指那些能够访问独立(自由)变量的函数 (变量在本地使用,但定义在一个封闭的作用域中)。换句话说,这些函数可以“记忆”它被创建时候的环境。特性:
  1. 函数嵌套函数
  2. 函数内部可以引用外部的参数和变量
  3. 参数和变量不会被垃圾回收机制回收

箭头函数:

  1. 箭头函数使得表达更加简洁。
  2. 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
  3. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
  4. 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。
  5. 不可以使用yield命令,因此箭头函数不能用作Generator函数。

Generator:

  1. Generator 函数是协程在 ES6 的实现,最大特点就是可以交出函数的执行权(即暂停执行)。
  2. next法返回值的value属性,是 Generator 函数向外输出数据;next方法还可以接受参数,向 Generator 函数体内输入数据。
  3. Generator 函数内部还可以部署错误处理代码,捕获函数体外抛出的错误。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • 函数就是最基本的一种代码抽象的方式。 定义函数function abs(x) {if (x >=0){return...
    _我和你一样阅读 447评论 0 0
  • 1.函数参数的默认值 (1).基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。
    赵然228阅读 690评论 0 0
  • 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 上面代码检查函数l...
    呼呼哥阅读 3,389评论 0 1
  • 俗人一个,除了喜欢看看书,也没什么高雅的兴趣爱好,俗人来讲一讲她最近看过的书的感受 一卡耐基写给女人 这本书有女人...
    是小鱼儿啊阅读 1,604评论 2 2