所以我很难理解何时使用call()
方法的适当时间。
我在网上找到了这个例子:
var person1 = { name: 'Chris' };
var sayName = function() { console.log(this.name) };
// How to use call method
sayName.call(person1)
我知道上面的例子允许你设置“this”的上下文,但为什么不把这个人作为param传递,如下所示:
var sayName = function(person) { console.log(person.name) };
sayName(person1);
有人可以帮助我理解为什么要使用call()
方法,而不是仅仅将这个人作为参数传递?
答案 0 :(得分:1)
如果它只是您必须在应用中输出的人的名字,那么,当然,使用call
而不是将名称作为参数传递并没有任何意义。
但是,想象一下你有25个不同领域的背景的情况。你会把所有25个字段作为参数传递吗?
另外,想象一下将name
属性添加到上下文的函数:
function person(firstName) {
this.name = firstName;
}
me = {}
teacher = {}
person.call(me, 'Charlie');
person.call(teacher, 'John')
此外,person
函数现在可以用作构造函数。
var someone = new person('Mary')
call
和apply
方法的使用确实超越了名称打印等简单方案。探索这些函数有用性的最佳方法是学习JS OOP。
答案 1 :(得分:0)
当我们谈论原型和类时,你总是可以认为调用函数总是将调用表达式的左侧部分(在点之前)传递给“隐藏”这个参数:
但是在你的情况下,sayName
函数与项目没有关联,所以你可能希望实现这个目的:
var person1 = { name: 'Chris' };
var sayName = function() { console.log(this.name) };
// you can imagine this as very simplified version of "call fn" do internally
person1.sayName = sayName;
person1.sayName(); // logs 'Chris'
如何实现代码只是程序员的选择。 在你的情况下,函数没有绑定到对象,所以你应该指定如何传递上下文,隐式或显式,并隐式传递它(通过点的左侧部分)不会使语言更少或更多功能。
如果你使用ES6 + env。在大多数情况下,你应该忘记调用和应用方法。
class Person {
constructor(name) {
this.name = name;
}
someFunc() {
console.log(this.name);
}
}
let person1 = new Person('Chris');
person1.someFunc(); // logs 'Chris'
let refToFn = person1.someFunc;
refToFn(); // error, because no implicit (via dot) or explicit (via arg) context passing
例如“Python”具有相反的范例,您应该始终将“this”(args上的“self”)上下文传递给方法:
def someFunc(self):
print self.name;
真正的问题可能是你想问的是为什么“这个”上下文存在于javascript中。
答案 2 :(得分:-2)
答案是:首先告诉我为什么你需要通过直接对象引用然后使用call()
函数?
见下文,当您直接传递任何对象时,即使不需要任何.call()
,也可以轻松实现:
var person1 = { name: 'Chris' };
var sayName = function(obj) { console.log(obj.name) };
sayName(person1);
你应该知道我们使用.apply()
,.call()
等的目的。将一个对象借给另一个对象的目的之一。