使用call方法而不是在参数中传递对象有什么好处

时间:2017-12-06 17:29:42

标签: javascript jquery

在下面的代码中,哪一个是正确的,以及这两个是如何不同的

使用调用方法

var obj = {
  num: 10
 };

var add = function(a) {
  return this.num + a
}
console.log(add.call(obj,4))

在参数

中传递对象
var obj = {
  num: 10
};
var add = function(obj,a) {
  return obj.num + a
}
console.log(add(obj,4))

1 个答案:

答案 0 :(得分:1)

您的第二个代码块只是一个常规功能。然而,第一个有点棘手。所以问题基本上是:

何时在javascript中使用上下文?

在javascript中,术语上下文基本上是指this。它通常在您调用对象方法时使用,以便您可以引用对象。这是OOP的核心概念之一,我们只在原型中定义一个函数,并且该类继承自它的每个对象都暴露了这个方法,没有上下文它将无法工作。这就是this的发明。但是在某些情况下,上下文在没有继承的情况下很有用。例如。事件处理程序通常是无上下文的,因为它们不是任何对象的一部分:

window.addEventListener("load", function(evt){
  const el = evt.target;
};

然而,由于它是一个窗口的事件处理程序,它是否有意义在窗口的上下文中执行?如果你现在说“是”,那么你(将)可能喜欢JS:

window.addEventListener("load", function(){
 this.document.body.innerHTML = "Dynamic context can be cool!";
});

因此在JS this中是引用对象的方式,函数引用。通过Function.prototype.call我们可以在任何地方使用它。然而,这并不意味着我们应该在任何地方使用它。 this应该保持在上下文的意义上,因为在其他地方使用它会造成混乱/丑化你的代码/使你的代码错误。

var add = function(a) {
 return this.num + a;
}

在你的codesnippet中,我认为它不清楚this指的是什么。所以它相当滥用this。但是,如果你将它作为 obj 方法,它可能会有意义,所以它的上下文从代码中变得清晰:

const num = {
  value:10,
  add(a){ return this.value + a }
};

如果使用继承使其可重用,它会变得更加美观:

class CustomNumber {
  constructor(n = 0){
    this.value = n;
  }

  add(a){ return this.value + a; }
}

const num = new CustomNumber(10);