1.定义
(1)匿名函数
(2)具名函数
(3)箭头函数,无this
词法作用域(也叫静态作用域)
JS看到上面的代码不是立马去执行,而是去构造词法树,也就是一个函数能访问那些变量在做词法分析的时候就以及确定了。词法作用域只能确定变量是那个变量,但是不能确定变量的值。call stack
(1) 普通调用 1+1+1
(2) 嵌套调用 1>2>3
(3) 递归this & arguments
(1) this 就是 call 的第一个参数!call 的其他参数统称为 arguments
(2) this 是隐藏的第一个参数,且一般是对象(如果不是对象,就显得很没有意义了)。那么this 为什么必须是对象?即使传入的不是对象,比如是数字,也会被new Number一下,变成一个对象,因为 this 就是函数与对象之间的羁绊。call / apply
(1)fn.call(asThis, p1,p2) 是函数的正常调用方式。
(2)当你不确定参数的个数时,就使用 apply,fn.apply(asThis, params)
(3)也就是确定参数个数的时候使用call,不确定参数个数的时候使用apply,这也是它们俩的区别。比如当我们去遍历一个数组求和,就算数组很小,但是使用call的话就如:sum.call(undefined, a[0],a[1],a[2]...),这个写就显得很智障了。
(4)若单独的函数(fn)没有依赖于对象,当调用fn.call()的时候,不传参数,this就是window,传了参数this就是call的第一个参数,一般不想指定this,可以使用undefined来占位,否则就会出现把我们想传的参数,默认第一个为this了。bind
call 和 apply 是直接调用函数,而 bind 则是返回一个新函数(并没有调用原来的函数),这个新函数会 call 原来的函数,call 的参数由你指定。return
每个函数都有 return。如果你不写 return,就相当于写了 return undefined。柯里化 / 高阶函数
(1)
//柯里化之前
function sum(x,y){
return x+y
}
//柯里化之后 ,类似于偏函数
function addOne(y){
return sum(1, y)
}
柯里化可以将真实计算拖延到最后再做:柯里化大多数是在模板引擎里面使用,大部分是用来惰性求值,如调用一个函数什么都没做,就是return了一个函数。若对一个字符串做很重的操作,如正则,ajax,要是直接声明就调用就显得麻烦,那么就可以在真正使用的时候再去调用,如在第二次调用的时候才生效,这样就是惰性求值。
(2)高阶函数:
在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:
- 接受一个或多个函数作为输入:如forEach sort map filter reduce。
- 输出一个函数:如lodash.curry。
- 不过它也可以同时满足两个条件:如Function.prototype.bind。
回调
名词形式:被当做参数的函数就是回调,还有一个隐含条件就是,这个被当作参数的函数得call一下,这个call就是callback,若不call就不是callback了。
动词形式:调用这个回调。
注意回调跟异步没有任何关系。构造函数
返回对象的函数就是构造函数,一般首字母大写。