1. 函数的重复声明
- 如果同一个函数被多次声明,后面的声明就会覆盖前面的声明。
2. 递归
function fn(n) {
if (n === 0) return 1
if (n === 1) return 1
return fn(n - 1) + fn(n - 2)
}
console.log(fn(6)) // 13
3. 函数声明和函数表达式
- 因为js存在预解析,即函数声明会被提升,所以如果同时采用function命令和赋值语句声明同一个函数,最后总是采用赋值语句的定义。
function fn() {
console.log(2)
}
var fn = () => {
console.log(1)
}
fn() // 1
4. 函数的属性和方法
- name属性:返回函数的名字
- length属性:返回函数预期传入的参数个数,即函数定义之中的参数个数
- toString方法:返回一个字符串,内容是函数的源码
5. 函数本身的作用域
- 函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域
- 函数体内部声明的函数,作用域绑定函数体内部
var a = 1
var x = function () {
console.log(a)
}
function f() {
var a = 2
x()
}
f() // 1
6. 同名参数
function f(a, a) {
console.log(a)
}
f(1, 2) // 2
7. arguments对象
- arguments对象是函数实参的集合,这个对象只有在函数体内部,才可以使用
8. eval
- eval命令接受一个字符串作为参数,并将这个字符串当作语句执行
- eval的本质是在当前作用域之中,注入代码。由于安全风险和不利于 JavaScript 引擎优化执行速度,所以一般不推荐使用
eval('var a = 1;')
console.log(a) // 1
网友评论