使用JS .call()方法的原因?

我感兴趣什么是在JS中有call()方法的原因。 它似乎重复了this调用通常的方法。

例如,我有一个call()的代码。

 var obj = { objType: "Dog" } f = function(did_what, what) { alert(this.objType + " " + did_what + " " + what); } f.call(obj, "ate", "food"); 

产量是“狗吃的食物”。 但是,我可以得到相同的结果分配给对象的function。

 var obj = { objType: "Dog" } f = function(did_what, what) { alert(this.objType + " " + did_what + " " + what); } obj.a = f; obj.a("ate", "food"); 

结果是一样的。 但这种方式更易于理解和使用。 为什么需要call()?

当您想要控制将在被调用函数中使用的作用域时,将使用调用。 你可能希望this关键字不是你分配函数的范围,在这种情况下,你可以使用callapply来调用你自己的范围的函数。

F.ex,它也允许你调用范围之外的工具方法,比如当使用“private”函数时:

 var obj = (function() { var privateFn = function() { alert(this.id); } return { id: 123, publicFn: function() { privateFn.call(this); } }; }()); obj.publicFn(); 

在上面的例子中, privateFn没有在obj公开,但它仍然可以被构造,就好像它是公共范围的一部分(以相同的方式使用this )。

它主要用于模拟OOP中的inheritance。

例:

 var Robert = { name: "Robert Rocha", age: 12, height: "5,1", sex: "male", describe: function() { return "This is me " + this.name + " " + this.age + " " + this.height + " " + this.sex; } }; 

可以说,上面是一个主对象(原型),你想inheritance另一个对象describe的function:

 var Richard = { name: "Richard Sash", age: 25, height: "6,4", sex: "male", } 

Richard对象没有描述函数,你只想简单地inheritance函数。 你会这样做:

 console.log( Robert.describe.call( Richard ) ); 

输出: This is me Richard Sash 25 6,4 male

你可能会在你的例子中使用第二种方法,但有时你想在另一个对象上使用一个对象的function。 一个例子就是使用像NodeList一样的类Array对象的Array方法

 var el = document.getElementById("foo"); [].forEach.call(el.children, function(child, index) { //Iterate over an element's children, performing an action on each one }); 

这是关于一streamfunction的概念。 像Javascript这样的基本语言可以让你把function当作自己的权利来对待。 函数可以存储在variables中或传递给其他函数。

call()提供了一种方法来执行一个独立的函数,而不是附加在任何其他对象上。