一、上来直接用… 用法简单清晰
- call:function.call(thisArg, arg1, arg2, ...) // 参数全部可选
- apply: function.apply(thisArg, [argsArray]) // 第一个参数必填,第二个参数是数组
- bin: function.bind(thisArg[, arg1[, arg2[, ...]]])
可以看到 用法几乎一样。
个人理解:call的用法,就是让一个【函数】,使用另外一个【对象】的属性或方法;
换句话说:就是将一个【对象】的属性或方法,注入到当前【函数】中;
二、call、
语法
function.call(thisArg, arg1, arg2, ...)
参数
【thisArg】:**可选的**。在 function 函数运行时使用的 this 值。
【arg1, arg2, ...】:指定的参数列表。
描述
call() 允许为不同的对象分配和调用属于一个对象的函数/方法。
call() 提供新的 this 值给当前调用的函数/方法。
你可以使用 call 来实现继承:写一个**方法**,然后让另外一个**新的对象**来继承它(而不是在新对象中再写一次这个方法)。
三、apply、MDN官方解释
语法
func.apply(thisArg, [argsArray])
参数
【thisArg】**必选的**。在 func 函数运行时使用的 this 值。
【argsArray】**可选的**。一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 func 函数。
如果该参数的值为 null 或 undefined,则表示不需要传入任何参数。
返回值
调用有指定this值和参数的函数的结果。
描述
1.在调用一个存在的函数时,你可以为其指定一个 this 对象。 【必填项的参数】
this 指当前对象,也就是正在调用这个函数的对象。
使用 apply, 你可以只写一次这个方法然后在另一个对象中继承它,而不用在新对象中重复写该方法。
2.apply 与 call() 非常相似,不同之处在于【提供参数的方式】。
apply 使用【参数数组】而不是一组参数列表。
apply 可以使用数组字面量(array literal),如 fun.apply(this, ['eat', 'bananas']),
或数组对象, 如 fun.apply(this, new Array('eat', 'bananas'))。
3.你也可以使用 arguments对象作为 argsArray 参数。
arguments 是一个函数的局部变量。 它可以被用作被调用对象的所有未指定的参数。
这样,你在使用apply函数的时候就不需要知道被调用对象的所有参数。
你可以使用arguments来把所有的参数传递给被调用对象。 被调用对象接下来就负责处理这些参数。
es6新增类数组用法:
从 ECMAScript 第5版开始,可以使用任何种类的类数组对象,就是说只要有一个 length 属性和(0…length-1)范围的整数属性。
例如现在可以使用 NodeList 或一个自己定义的类似 {‘length’: 2, ‘0’: ‘eat’, ‘1’: ‘bananas’} 形式的对象。
四、bind、MDN官方解释
语法
function.bind(thisArg[, arg1[, arg2[, ...]]])
参数
【thisArg】调用绑定函数时作为 this 参数传递给目标函数的值
【arg1, arg2, ...】当目标函数被调用时,被预置入绑定函数的参数列表中的参数。
返回值
返回一个原函数的拷贝,并拥有指定的 this 值和初始参数。
描述
bind() 函数会创建一个新的绑定函数(bound function,BF)。
绑定函数是一个 exotic function object(怪异函数对象,ECMAScript 2015 中的术语),它包装了原函数对象。
调用绑定函数通常会导致执行包装函数。
绑定函数具有以下内部属性:
[[BoundTargetFunction]] - 包装的函数对象
[[BoundThis]] - 在调用包装函数时始终作为 this 值传递的值。
[[BoundArguments]] - 列表,在对包装函数做任何调用都会优先用列表元素填充参数列表。
[[Call]] - 执行与此对象关联的代码。通过函数调用表达式调用。
内部方法的参数是一个this值和一个包含通过调用表达式传递给函数的参数的列表。