在这种情况下,为什么我会使用call()方法?

时间:2018-01-16 09:56:39

标签: javascript jquery ecmascript-6 call

所以我很难理解何时使用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()方法,而不是仅仅将这个人作为参数传递?

3 个答案:

答案 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')

callapply方法的使用确实超越了名称打印等简单方案。探索这些函数有用性的最佳方法是学习JS OOP。

答案 1 :(得分:0)

当我们谈论原型和类时,你总是可以认为调用函数总是将调用表达式的左侧部分(在点之前)传递给“隐藏”这个参数:

  1. myObj.someFunc() - myObj
  2. someFunc()// strict - undefined
  3. someFunc()// unstrict - window / global
  4. 但是在你的情况下,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()等的目的。将一个对象借给另一个对象的目的之一。