Open XXHolic opened 5 years ago
在关于 this 绑定中谈到显式绑定 this 使用的方法: apply、call 和 bind ,在这里进一步进行了解。
this
apply
call
bind
apply 方法调用一个具有给定 this 值的函数。
语法: func.apply(thisArg, [argsArray]) 参数:
在严格模式和非严格模式下使用,结果有些不同。
function getName() { // "use strict"; console.info(this); } var book1 = { name: 'How to laugh' }; getName.apply(book1); getName.apply(null); getName.apply(undefined); getName.apply(); getName.apply(1); getName.apply('one'); getName.apply(true);
call 方法与 apply 方法的作用类似,区别是接收参数形式不一样。
语法: func.apply(thisArg, arg1, arg2, ...) 参数:
var array1 = [1,2]; array1.push.call(array1,3,4); console.info(array1); // [1,2,3,4]
bind 方法创建一个新的函数,在调用时设置 this 关键字为提供的值。
语法: func.bind(thisArg, arg1, arg2, ...) 参数:
返回值: 返回一个原函数的拷贝,并拥有指定的 this 值和初始参数。
function getName() { console.info(this); } var book1 = { name: 'How to cry', getName: getName }; var getName2 = book1.getName; var getNameBind = getName2.bind(book1); getName2(); getNameBind();
bind 方法创建新的绑定函数(bound function),是一个包装了原函数对象的怪异对象。
绑定函数拥有以下属性:
当调用绑定函数时,调用的是 [[BoundTargetFunction]] 的内部方法 [[Call]] ,像这样 Call(boundThis, args)。其中,boundThis 是 [[BoundThis]] ,args 是 [[BoundArguments]] 。
[[BoundTargetFunction]]
[[Call]]
Call(boundThis, args)
boundThis
[[BoundThis]]
args
[[BoundArguments]]
引子
在关于 this 绑定中谈到显式绑定
this
使用的方法:apply
、call
和bind
,在这里进一步进行了解。apply
apply
方法调用一个具有给定this
值的函数。语法:
func.apply(thisArg, [argsArray])
参数:
在严格模式和非严格模式下使用,结果有些不同。
点击查看结果
非严格模式: ![39-apply-no-strict][url-local-apply-no-strict] 严格模式: ![39-apply-strict][url-local-apply-strict]其它应用
#### 将数组添加到另外一个数组 ```javascript var array1 = [1,2]; var array2 = [3,4]; array1.push.apply(array1,array2); console.info(array1); // [1,2,3,4] ``` #### 求数组中的最大和最小值 ```javascript var min = Math.min.apply(Math,[5, 6, 2, 3, 7]); var max = Math.max.apply(Math,[5, 6, 2, 3, 7]); console.info(min); // 2 console.info(max); // 7 ``` #### 判断数组 ```javascript function isArray(obj) { return Object.prototype.toString.apply(obj) === '[object Array]'; } console.info(isArray([])); // true console.info(isArray({})); // false ``` #### 将类数组转换为数组 ```javascript var obj = { 0: 'apple', 1: 'orange', 2: 'banana', length: 3, }; var arr = Array.prototype.slice.apply(obj); console.info(arr); // ["apple", "orange", "banana"] ```call
call
方法与apply
方法的作用类似,区别是接收参数形式不一样。语法:
func.apply(thisArg, arg1, arg2, ...)
参数:
bind
bind
方法创建一个新的函数,在调用时设置this
关键字为提供的值。语法:
func.bind(thisArg, arg1, arg2, ...)
参数:
返回值:
返回一个原函数的拷贝,并拥有指定的
this
值和初始参数。点击查看结果
![39-bind][url-local-bind] `getName2` 是一个引用,最终指向的是方法 `getName` ,在执行的时候,`this` 是默认绑定,指向 `window` 对象。 `getName2` 使用 `bind` 方法创建了一个新的方法,它的 `this` 指向了 `book1` 。bind
方法创建新的绑定函数(bound function),是一个包装了原函数对象的怪异对象。绑定函数拥有以下属性:
当调用绑定函数时,调用的是
[[BoundTargetFunction]]
的内部方法[[Call]]
,像这样Call(boundThis, args)
。其中,boundThis
是[[BoundThis]]
,args
是[[BoundArguments]]
。比较
相同点
this
的指向。this
要指向的对象。不同点
apply
和call
的传参形式不一样。apply
和call
是立即执行函数,而bind
是返回改变this
指向后的一个函数。参考资料