在下面的代码中,哪一个是正确的,以及这两个是如何不同的
使用调用方法
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))
答案 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);