需要JavaScript调用函数对象的方法
Need for JavaScript call method on function object
取一个简单的匿名函数,接受3个参数:
function hello(firstname, surname, city) {
console.log('Hi ' + firstname + ' ' +
surname + '. I see you''re from ' + city)
}
使用函数方法"call"调用这个函数比直接调用函数有什么好处?。
hello('Jane','Mansfield','Philadelphia');
和
hello.call(this,'Jane','Mansfield','Philadelphia');
无稽之谈:http://jsfiddle.net/wC3xz/1/
很抱歉,但是看了文档没有发现任何线索。我唯一能想到的是,如果你能访问传递给函数的this对象。但是从匿名函数中访问这个不就是在匿名函数的上下文中,也就是窗口吗?
何时需要调用而不仅仅是functionname(args)?
call有什么大不了的?
调用在15.3.4.4节的规范中定义。当您试图在函数内设置thisArg时,您可以使用.call
。
我将如何使用它?
下面是如何使用的一个例子:
var me = { name: 'dr.eval' }
foo.call(me); // if you omitted the 'call' it would error because this defaults to the window object.
function foo() {
alert(this.name + ' is home');
}
Function.prototype.call
我什么时候使用它?
下面是使用call的一个非常典型的例子:
很多DOM方法返回NodeList
。虽然NodeList是一个类似数组的对象,但您不能在其上本机调用数组方法。但是,由于它们在设计上与数组相似,因此可以使用.call
如果您打开控制台并键入
document.getElementsByTagName("a").forEach
将得到undefined,因为它返回一个NodeList,而NodeList没有forEach方法。然而,迭代NodeList可能是可取的,因此您可以执行以下操作:
[].forEach.call(document.getElementsByTagName("a"),function(elem){
console.log(elem);
});
它将记录页面上所有的锚元素。
另一个常见的例子是arguments
,这是另一个"类数组"对象。通常,我们希望像处理数组一样处理参数,但我们不能这样做。再一次,.call
来拯救我们可以这样做:
[].slice.call(arguments,0); // returns a clone of arguments, but a real array we can work with!
在处理事件时也很有用,通常它显示了JavaScript的灵活性。这是一种在对象之间共享功能的方法,否则这些功能是无法共享的。
使用函数方法"call"调用这个函数比仅仅调用函数有什么好处?
- 。只有当您想要将上下文(this)转移到函数 时,它才有用。
何时需要调用而不仅仅是functionname(args)?
-
当你想在不同的上下文中调用现有的方法时。例如,参数对象与
Array
类似,但不能直接使用sort()
。function Test() { // call sort from Array context onto arguments object console.log(Array.prototype.sort.call(arguments)); // 2 3 5 8 // error: arguments object doesn't contain sort console.log(arguments.sort()); } Test(5,3,8,2);
使用
.call
和
.apply
当涉及到重写。
this
是一个很好的文章,了解更多。
通常使用call()的好处是它允许您显式地设置函数的上下文。对于您所展示的简单函数来说,这没有多大价值,但如果您的函数是对象的方法或回调函数,则设置上下文可能是相关的。
- 序列化数据属性中对象的最可靠方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 如何从对象的原型方法访问JavaScript对象属性
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- 设置嵌套对象属性的更好方法
- JQuery示例不起作用-“;对象没有't支持属性或方法'按钮'&”;
- 对象不支持属性或方法“自动完成”
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- 对象文字方法上的Javascript绑定不起作用
- Meteor应用程序无法运行-对象#<编译器>没有方法'主机'
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- Underscore.js某些对象的所有方法的总和
- 对象#<XMLHttpRequest>没有方法'完成'
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- 丢失对象“;这个“;方法中的上下文
- 如何在ajax中调用javascript对象的方法
- 为什么页面方法对象未定义
- 如何使用在另一个文件中定义的JavaScript方法/对象
- 如何告诉JsHint忽略“未解析的函数或方法”?对象上的警告
- 使用jinja/javascript动态创建方法/对象