1、ES5怎么设置函数参数的默认值
答:function aa(x){ x = x || ‘hello’ console.log(x) }
2、ES6怎么设置函数参数的默认值
答:可直接设置在参数后面 function aa(x = ‘hello’){ console.log(x) }
3、ES6中函数的默认参数有什么特点
答:默认参数是惰性的,每次调用函数,都是重新计算,而不是在每次进行叠加 let x = 11 function a(p = x+1){console.log§} a() // 12 x = 12 a() // 结果为13 惰性求值,并不会继续使用第一次 p=12的值
4、函数的length怎么进行计算
答:length是第一默认参数出现之前的参数个数,也不包括rest参数 (function a(){}).length // 0 (function a(x, y=1, z){}).length // 1 (function a(…rest){}).length // 0
5、函数的参数设置默认参数和不设置默认参数的区别
答:设置了默认参数的会单独形成一个作用域,等到初始化结束,这个作用域才会消失 没有设置默认参数的不会形成单独作用的
6、怎么获取函数的剩余参数
答:使用函数的 rest参数,即可获得由剩余参数所组成的数组 function a(x, …rest){console.log(rest)} a(1,2,3,4,5) // [2,3,4,5]
7、函数的rest参数后面如果跟着其他参数,会怎么样
答:会报错
8、严格模式可以在函数体内进行设置吗
答:ES5中可以 ES6中如果函数的参数设置了默认参数、解构赋值、扩展运算符,那么函数体内设置严格模式会报错。 可以通过设置全局严格模式
9、怎么获取函数的函数名
答:通过函数的name属性 (function a(){}).name // 常规函数返回函数名 ‘a’ (function (){}).name // 匿名函数返回空字符串’’ (() => {console.log(1)}).name // 箭头函数返回 空字符串’’ (new Function).name // 匿名函数返回 anonymous ((function a(){}).bind({})).name // bind函数返回 ‘bound a’
10、如果将一个匿名函数赋值给一个变量,那么这个函数的name会是什么
答:ES5中返回空字符串,ES6中会返回变量名
11、如果将一个具名函数赋值给一个变量,那么name是什么
答:返回这个函数的函数原本函数名,而非变量名
12、箭头函数的特性
答:箭头函数没有自己的this 箭头函数不可以作为构造函数 箭头函数不能用 arguments,但可以使用 rest 参数 箭头函数不能用作Generator函数,不能使用 yield 命令 this指向的是函数定义时所在的对象,而不是执行时所在的对象
13、箭头函数的this的指向固定化是为什么?
答:因为箭头函数没有自己的this,this是外层对象。所以箭头函数不能作为构造函数
14、箭头函数可以使用call() bind() apply来改变this的指向吗?
答:不能,因为箭头函数本身没有自己的this
15、ES7中的函数绑定运算符是什么?
答:函数绑定运算符的功能和 call bind apply一样,就是将一个函数绑定到一个对象上,改变函数的this指向 bar::aaa // 表示aaa绑定到bar对象上,this的指向变成 bar,相当于 aaa.bing(bar) foo::aaa(…arguments) // 表示aaa绑定到foo对象上,this的指向变成foo,相当于aaa.apply(foo, arguments)
16、什么是函数的尾调用
答:函数的最后一步是调用一个函数,形如下面这种形式 function a(x){ return g(x) }
17、什么叫做‘尾调用优化’
答:当函数的内层函数不用外层函数的变量时,可以直接去掉外层函数而保留内层函数的调用桢时,就叫做‘尾调用优化’ function a(){ return function b(){ console.log(111) } } 可以直接尾调用优化成: function b(){ console.log(111) } 注意:只有函数是尾调用函数的时候,才能实现 尾调用优化
18、什么叫做‘递归’
答:函数自己调用自己,叫做 递归
19、什么叫做‘尾递归’
答:尾调用函数调用自身,叫做 尾递归。可大大的节省内存
20、尾递归相比于 递归有什么优点?
答:永远不会‘栈溢出’。因为递归有成百上千的调用桢,容易发生栈溢出, 而尾递归的栈只存在一个调用桢,所以不会溢出
21、函数编程概念中的 ‘柯里化’是什么?
答:就是把多个入参函数改一单个入参的函数
22、严格模式下可以进行 尾调用优化吗?
答:不行。因为函数里面存在 arguments(调用时函数的参数)和caller(调用当前函数的那个函数) 尾调用优化的时候会改变调用栈,所以 arguments和caller就会失真报错
23、在严格模式下怎么实现 尾调用优化的效果呢?
答:使用循环代替
24、ES2017的对于函数定义和函数调用的尾逗号的处理是什么?
答:ES2017之前不允许出现尾逗号 ES2017之后允许函数定义和调用时最后一个参数可以有逗号的存在 这样就和对象数组等统一逗号的规范
|