每种语言有点区别,函数表达式也有点不一样
可以认为这个后面的匿名函数就是lambda表达式
![
申明提升
python的东西可以在这里加强一下
这里是把匿名函数立即调用了,一旦调用就是生成器对象,就可以next了
直接写return不允许
箭头函数
还有其他的写法,逗号表达式是以加5为准
要看x=右边多少
undefined的未定义
返回undefined
返回的结果是一个数组,每次返回的undefined加到了数组里去
打印的函数一般没有返回值
要想有返回值,逗号表达式不允许出现return
需要这么写
所以这个箭头函数等于
但是JS觉得还不够精简,只有一条语句,且没有return,是可以把大括号去掉的
x输入进去,加10,然后输出到屏幕,函数的返回值是undefined
只有一条语句可以不加括号,但是不能有return
虽然可以答疑110,但是没有返回值就是undefined
有返回值
如果只有一条return语句可以精简更多,直接写成这样,不管x是什么,都return 2000
这个函数就等价于这个样子
把上面的转换成箭头函数
一个参数的情况下,a即可
如果是2个参数,写成这样就是逗号表达式,不对
只能括起来
如果是无参,就用括号,中括号,如果是一参,可以加括号也可以不加括号,大于一个参数,多个参数应该用括号括起来
右边是一条语句,就可以舍弃掉大括号,如多余一条语句,大括号就不可以舍弃
这样写等价于这个
这个函数就相当于后面return undefined
等于这个样子
箭头函数在ES6用的很多,很精简,可以一眼看出表达的意思是什么
return可以变化成这些,单独的return语句可以把大括号全部去掉
箭头函数没有参数用()括号
只有一个参数,可以省略小括号
多个参数不能省略小括号,且使用逗号间隔
一个函数什么都不写,相当于return undefined,写了return,那return 什么就是什么。
return的时候,是用逗号表达式,这时候的值就跟逗号表达式的值有关系
等于10没有问题
y是undefined,这里做了隐式转换
这里没有像python的关键词的说法,只有表达式赋值的结果(5,6),python特殊,别的语言不这么玩
这样传只有x有值,y相当于只定义了变量,没有赋值,就是undefined,NaN加任何数字就还是NaN
总结:JS传参,可以使用缺省值,好习惯是把缺省值放在最后,
这么写x就是undefined,就是NaN
undefined+字符串是拼接,undefined+数字是NaN
这里现在有缺省值
在JS中,没有python那么复杂,只有形参定义,没有关键字传参,只有形参,可以给缺省值,但是缺省值建议往后。能对应的对应,不能对应的,多的就丢弃截断。
**
JS没有关键字传参
JS只做参数位置的对应
JS 并不限制默认参数的位置。
建议只要有参数缺省值就往后写,python有些例外,缺省值不能写到可变参数后面,可变关键字参数需要放到最后,keyword-only是缺省值,可变位置传参,和关键字的传参的缺省值应该放在可变参数前,再往前是最普通的的参数**
6789被y收入了
在后面加个参数z就不可以了,剩余参数应该是最后一个
in就是用的索引
ES6的箭头函数不建议使用这个
在JS里,只要有大括号都是对象
把arguments,把你传的所有参数收集进来
但是现在是传统的function定义方法,arguments需要改进下,所以就帮你把所有的参数都收集了
传参依然放到arguments了,但是能用的就是,x,y,arguments会把传实参的所有参数收集,但是已经退出历史舞台,能不用就不用
在箭头函数使用,就不是刚才function传统定义的意思 了,这些其实是全局的一些信息
箭头函数毕竟是ES6重新提供的函数,内部实现也是有区别的
箭头函数使用arguments就根本不是你想要的东西
所以到ES6可以不使用了
解构
相当于把这5个参数做解构,5个参数分别跟这些形参对应,x=1,y把2345全部收掉
JS报错虽然少,但是很容易造成程序开发疏忽
JS支持参数解构,不需要结构后的值个数和参数个数对应
值不够就是,undefined,相加就是NaN
返回值一直都是一个
赋值表达式的值:等号右边的值,逗号表达式的值,就是最后一个表达式的值
a=逗号表达式最后的值,等于true
b 的值是test
最后是ok出来就是ok
作用域
a可以
b没问题,要么是函数作用域,要么是全局作用域,顶格就是全局,还有申明提升的作用,不赋值就是undefined
c不可见,出不来语句块
查看下面例子
x全局
z出不去语句块
var o提升到函数的最大作用域
t=‘free’,只要函数定义,就跑到全局的
let p 出不去语句块*
P在语句块里出不来
z在外层定义,里面是可以打印的
函数执行完,只保留了t,因为t是全局的,所以定义的时候最好不这么定义
这里如果后面有var z=10,可以打印,因为申明提升,但是还未赋值,是undefined
const常量是不允许修改的
还有严格模式,照样执行完了,没起作用是要求写在第一行
直接报错
x必须是var或者let
严格模式必须写在代码的的第一行
异常
这样就抛出异常了
也可以使用try语法,catch抓住,几乎所有都支持finally
这一次抓住了
抓住现在就什么都不做,刚才是抓住之后打印信息
抛出来的东西是new出来的,是object
实际上取的name就是constructor.name,有构造器的
以前是在catch这里写什么类型,变成了在里面对e进行,判断它的type,instanceof,用in来判断
子类可以属于父类,但是父类不可以说是子类,通过istanceof,来判断异常是什么样的
这里没有除0异常
这个东西真当异常抛出,python如果要抛出一定是要exception子类
总结:在JS中,只要throw后面抛出一个对象即可,没有什么具体要求,只要有异常都可以catch住,一个入口catch住,只要是异常都可以catch住,在catch中你想写什么都随你写,可以用instanceof,也可以直接取类型名字,拿到之后做相应处理,finally做最后的处理
**没有finally也可以,try,catch,finally,都不能单独使用,try一般是,try catch,try finally,try catch finally
**
理解作用域和箭头函数,箭头函数用的新语法,就是新办法