首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解javascript借用方法

理解javascript借用方法
EN

Stack Overflow用户
提问于 2016-07-07 13:06:41
回答 2查看 1.9K关注 0票数 7

关于如何将函数的arguments转换为真正的数组,有很多解释。

但是,当您在bind的帮助下简化代码时,我发现非常有趣。

MDN Array.prototype.slice类数组对象

MDN Function.prototype.bind -创建快捷方式

例如:

代码语言:javascript
复制
function list() {
  return Array.prototype.slice.call(arguments);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

简化呼叫:

代码语言:javascript
复制
var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);

function list() {
  return slice(arguments);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

如果您使用apply而不是call,它的工作方式是相同的。

代码语言:javascript
复制
var slice = Function.prototype.apply.bind(unboundSlice);

使用来自任何函数实例的call甚至可以缩短它,因为它与原型中的相同,与来自数组实例的slice的方法相同:

代码语言:javascript
复制
var slice = alert.call.bind([].slice);

你可以试试

代码语言:javascript
复制
var slice = alert.call.bind([].slice);

function list() {
    console.log(slice(arguments));
}

list(1, 2, 3, 4);

因此,我脑海中出现的第一个非常奇怪的事情是在apply上调用apply,但是bind的第一个参数应该是对象(作为上下文),而不是函数(Array.prototype.slice)。

另一种方法是以同样的方式处理callapply

我写了很长一段时间的javascript,每天都很自信地使用这些方法,但是我不能把我的头绕在这上面。

也许我遗漏了一些非常基本的细节。

有人能解释一下吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-07 15:40:39

bind的第一个参数应该是一个对象(作为上下文)

是。

而不是函数(Array.prototype.slice)。

为什么不行?首先,所有函数都是对象,所以这里没有什么问题。

从另一个角度来看,如果使用slice.call(…)slice.apply(…),那么slice对象就是call/apply方法调用的上下文(接收者)。

绑定applycall有什么区别?

applyBoundToSlice(arguments)callBoundToSlice(arguments)之间没有差异。如果您希望将开始参数和结束参数传递给applyBoundToSlice(arguments, [0, n]),则callBoundToSlice(arguments, 0, n)slice之间的区别是。

票数 2
EN

Stack Overflow用户

发布于 2019-07-16 16:37:48

可以使用call关键字实现方法借用。下面的例子显示了方法的借用。

代码语言:javascript
复制
var john = {
  name: "John",
  age: 30,
  isAdult: function() {
    console.log(this.name+"'s age is "+this.age);
    if (this.age > 18) {
      return true;
    } else {
      return false;
    }
  }
}

console.log(john.isAdult());

var rita = {
  name: "Rita",
  age: 15
}

console.log(john.isAdult.call(rita));

注意最后一行。如何使用关键字调用和如何将rita对象传递给函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38246313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档