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

函数的定义和调用:

  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复制代码
  5. 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 []复制代码
  6. 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';
    };复制代码
  6. 在for循环是无法定义具有局部作用域的的变量的。在ES6中可以使用let替代var可以申明一个块级作用域的变量。
  7. 对于常量的定义,以前都是使用全部大写来规定,现在ES6总可以使用关键字const来定义常量,constlet都具有块级作用域,并且const定义以后无法修改。
  8. 补充说明一下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还加入了一个bind()方法,它会创建一个函数的实例,其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 函数内部还可以部署错误处理代码,捕获函数体外抛出的错误。

有错误希望指出,一定会及时修改!

转载于:https://juejin.im/post/58c27ccd570c350058253740

廖雪峰JS学习总结-函数篇相关推荐

  1. Python学习笔记---------廖雪峰(基础和函数)

    Python学习笔记---------廖雪峰(基础和函数)

  2. 廖雪峰python3高阶函数部分理解

    廖雪峰python3高阶函数部分理解 时间:2018年04月21日00:00:03 4.20,看了廖雪峰的python3教程,没有看太多,只看了高阶函数的map(前几天),reduce,filter, ...

  3. python 廖雪峰_python学习(廖雪峰的官方网站)

    廖雪峰的官方网站. 请注意区分命令行模式和Python交互模式. 在命令行模式下,可以直接运行.py文件. 2运行其实和java运行一样 cd dir 3 print() input() 4数据类型 ...

  4. Node.js学习笔记——Express篇(1.初识Express)

    简介 什么是 Express 官方给出的概念:Express是基于 Node.js 平台,快速.开放.极简的Web开发框架 通俗的理解:Express的作用和Node.js内置的http模块类似,是专 ...

  5. 廖雪峰git学习资料-涂改笔记

    注意: 本文章是看廖雪峰官网资料整理而来原地址如下: http://www.liaoxuefeng.com/ 附件为git常用命令 前言: 注意的问题 如果是首次提交会第一步:先在本地建立一个一样的仓 ...

  6. 廖雪峰Git学习笔记2-时光机穿梭

    基本都是按照廖雪峰老师的重新敲打了一遍,增强记忆,中间穿插了一些自己的理解,新手可能有误,请看原版: https://www.liaoxuefeng.com/wiki/896043488029600/ ...

  7. 【廖雪峰Python学习笔记】高阶函数

    Higher-order function 高阶函数 映射 过滤算法 排序算法 高阶函数 变量可指向函数 >>> abs # 函数 <built-in function abs ...

  8. 廖雪峰讲python高阶函数求导公式_廖雪峰的学习笔记(三)高阶函数

    1.所谓的"高阶函数":把函数对象作为参数的函数. 2.示例: map()函数: 我们先看map.map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数 ...

  9. 廖雪峰JS教程学习记录---字符串

    1.由于多行字符串用\n写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用'...'表示`这是一个 多行 字符串`; 2.字符串常见的操作如下: s.length; // 13 要 ...

最新文章

  1. java实现zip的压缩和解压(支持中文文件名)
  2. 训练自己haar-like特征分类器并识别物体(1)
  3. Response.Redirect ,Server.Transfer ,Server.Execute, 的区别(比较)
  4. linux未知的类型名 FILE,smb使用 ------转载自http://blog.csdn.net/tlaff/article/details/5463068...
  5. 最新升学e网通JS逆向分析
  6. 多系统重装其中Win7后的启动引导列表恢复
  7. 如何在mysql命令窗口获取到程序正在执行的sql语句
  8. 【医疗影像处理】使用前景像素的均值和方差(mean,std)对图像进行归一化(背景像素为0)【numpy-code】
  9. Iocomp ActiveX/VCL 2021 绿色版
  10. iTextSharp 添加图片
  11. python-声音录制和处理
  12. 使用 Envoy 和 AdGuard Home 阻挡烦人的广告
  13. 用c++实现蓝桥杯超级玛丽
  14. 如何配置 Cilium 和 BGP 协同工作?
  15. 全国首例!法院判售假者在淘宝网说“对不起”
  16. php活体检测,双目活体检测摄像头,人脸识别SDK,红外活体算法
  17. html中如何做出生年月日,出生年月日怎么换成生辰八字
  18. 显示器U2518怎么连服务器,【戴尔 U2518D 显示器使用感受】尺寸|分辨率|边框|底座|颜色_摘要频道_什么值得买...
  19. 【实战记录】使用阿里云的OSS云存储,上传与删除图片及遇到的问题
  20. 三大受欢迎的免费开源CMS建站系统

热门文章

  1. pinpoint配置mysql_pinpoint的安装和部署
  2. 【转载】用外部程序启动AutoCAD方法的研究(启动闪屏制作与CreateProcess启动操控AutoCAD探索)
  3. 安装MXNet模块遇到的问题以及解决办法
  4. pDC-SetPixel() 含义
  5. IDM 6.25build 21超精版/超晶版
  6. HSMES系统看板管理——实现生产车间可视化
  7. Face Paper:Face Attention Network: An Effective Face Detector for the Occluded Faces
  8. html动态加载js文件
  9. C端元宇宙扎克伯格解释的很详尽了,B端的元宇宙也该解释一下了
  10. 如何让人工智能拥有情绪?