使用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
关键字不是你分配函数的范围,在这种情况下,你可以使用call
或apply
来调用你自己的范围的函数。
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()
提供了一种方法来执行一个独立的函数,而不是附加在任何其他对象上。