XXHolic / segment

some notes
MIT License
28 stars 4 forks source link

apply、call 和 bind 方法 #41

Open XXHolic opened 5 years ago

XXHolic commented 5 years ago

引子

关于 this 绑定中谈到显式绑定 this 使用的方法: applycallbind ,在这里进一步进行了解。

apply

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);
点击查看结果 非严格模式: ![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, ...)
参数:

  var array1 = [1,2];
  array1.push.call(array1,3,4);
  console.info(array1); // [1,2,3,4]

bind

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();
点击查看结果 ![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]]

比较

相同点

不同点

参考资料