理解函数调用
函数中的两个隐含的参数
arguments和this
arguments
arguments参数是传递给函数的所有参数集合。
arguments有length属性,并且可以通过数组下标的方式访问每一个元素,但它不是数组。
arguments对象作为函数参数的别名。(避免使用,影响可读性,在严格模式下无法使用)
this
this参数:函数上下文。
函数调用
*作为一个函数,直接被调用。
此时this的值有两种可能性:在严格模式下为undefined;在非严格模式下为全局上下文(Window对象)。
*作为一个方法,关联在一个对象上,实现面向对象编程。
此时该对象会成为函数的上下文。
*作为一个构造函数,实例化一个新的对象。
想要以此方式调用,需要在前用加上关键字new。
注意区别函数构造器和构造函数。
如果构造函数返回一个对象,则该对象将作为整个表达式的值返回,而传入构造函数的this将被丢弃。
但是,如果构造函数返回的是非对象类型,则忽略返回值,返回新创建的对象。
*通过函数的apply或者call方法。
call和apply方法的第一个参数都会被作为函数的上下文,不同之处在于后续的参数。apply方法只需要一个额外的参数,也就是一个包含参数值的数组;call方法则需要传入任意数量的参数值。
强制指定回调函数的函数上下文。
解决函数上下文的问题
*使用箭头函数绕过函数上下文
箭头函数作为回调函数:箭头函数的this与声明所在的上下文的相同。
警告:箭头函数和对象字面量
在全局代码中定义对象字面量,在字面量中定义箭头函数,那么箭头函数内的this指向全局window对象。
*使用bind方法
所有函数均可以访问bind方法,可以创建并返回一个新函数,并绑定在传入的对象上。不管如何调用该函数,this均被设置为对象本身。被绑定的函数与原始函数行为一致,函数体一致。