每个函数都包含两个非继承而来的方法: apply() 、 call()。
两个方法都的用途都是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。
1、 apply() ,接受两个参数,一个是在其中运行函数的作用域,另一个是参数数组;其中,第二个参数可以是 Array 的实例,也可以是 arguments 对象。
2、call(),方法类似 apply() 方法,区别在于接收参数的方式不同;第一个参数是 this 不变,变的是其余参数都直接传递给函数。(需要将参数都列举出来)
事实上,传递参数并非 apply() 、call() 的真正用武之地;他们的强大在于能够扩充函数运行的作用域:
showColor() 也是作为全局函数定义的,当全局作用域中调用它时,对 this.color 求值会变成 window.color ,所以结果是 red。
而 showColor().call(this) 和 showColor().call(window) 则是两种显示地在全局作用域中调用函数的方式,结果自然是 red。
但是当运行 showColor().call(o) 时,函数的执行环境就不一样了,此时函数体内的 this 指向了 o,于是结果显示的是 blue。
结论:使用 call() 或 apply() 来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。
ECMAScript 5 还定义了一个方法: bind(),这个方法会创建一个函数的实例,其 this 值会被绑定到传给 bind() 函数的值:
showColor() 调用 bind() 并传入对象 o,创建了 objShowColor() 函数,这个函数的 this 值等于 o。
因此,即使全局作用域中调用这个函数,也会看到 blue。