1.1:两种定义变量的方式区别
通过var定义变量,可以重复定义同名的变量,并且后定义的会覆盖先定义的
如果let定义变量,“相同作用域内”不可以重复定义同名的变量
1.2:是否能够先使用后定义
var可以先使用 后定义,预解析
let不可以,报错,不会预解析
1.3:能否被{}限制作用域
将var定义的变量放到一个单独的{}里面,还是一个全局变量
将let,是一个局部变量。
在js中{}外面的作用域,作为全局作用域
在js中函数后面{}的作用域,为局部作用域。
在es6中只要{}没有和函数结合在一起,我们称之为块级作用域
1.4块级作用域和局部作用域的区别
在块级作用域中通过var定义的变量是全局变量
在局部作用域中通过var定义的变量是局部变量
1.5变量的作用域链
函数预解析
变量,函数声明放在最前面,然后按顺序执行。
1.6 es6之前的定义函数的方式
//es6之前定义 函数的形式,是会被预解析的,所以可以提前调用。
function say(){ console.log('hello') }如果函数赋值给一个var定义的变量,那么函数不会被预解析,只有变量会被预解析
say() var say = function (){ console.log('hello') } //报错say is not a function //预解析 var say; //undefined say(); say = function (){ console.log('hello') }不会预解析
say(); say is not defined //es6后 let say = ()=>{ console.log('hello') }注意点:1:在高级浏览器中,不会对{}中定义的函数进行提升
2:如果变量名称和函数名称同名,那么函数的优先级高于变量。
所以,不要让变量名称和函数名称重名。
3:es6行参默认值
es6之前,可以通过逻辑运算符来给行参指定默认值
function getSum(a,b){ a=a||'111', b=b||'222' console.log(a,b) }es6开始,可以直接在行参后面通过=指定默认值
function getSum(a="111",b="222"){ console.log(a,b) }也可以从其他函数中获取
function getSum(a = "111",b = getDefault()){ console.log( a , b) } function getDefault(){ return '111' }4:匿名函数
没有名称的函数就是匿名函数,不能够只定义不使用。
应用场景:
4.1作为其他函数的参数
4.2作为其他函数的返回值
4.3作为一个立即执行的函数
(function(){ console.log('111') })(); //需要用()把函数包裹起来后,再加(),立即执行5:箭头函数
1:如果函数中只有1个行参,()可以省略,如果{}中只有一句代码,{}可以省略。
let say = (name) => { console.log('111') } let say = name => console.log('111')