call(), apply(), bind()三个晦涩函数

来源:互联网 发布:java怎么求质数 编辑:程序博客网 时间:2024/05/22 09:45

1.call()函数和apply()函数

JS中每个函数都有call()和apply()两个方法,可以用他们来触发函数。并指定相关的调用参数。
此外,这两个方法还有另外一个功能,它可以让一个对象去“借用”另一个对象的方法,并为己用。这也是一种非常简单而实用的代码重用。
例如,下面我们定义一个some_obj对象,该对象中有一个say()方法:
var some_obj ={
name :’Ninja’,
say : function(who){
return ‘Haya’ + who + ‘, I am a ’ + this.name;
}
};
这样一来,我们就可以调用该对象的say()方法,并在其中使用this.name来访问其name属性了:
some_obj.say(‘Dude’);
“Haya Dude,I am a Ninja”
下面,我们再创建一个my_obj对象,它只有一个name属性:
var my_obj = {name: ‘Scripting guru’};
显然,some_obj的say()方法也适用于my_obj,因此我们希望将该方法当做my_obj自身的方法来调用。在这种情况下,我们就可以试试say()函数中的对象方法call:
some_obj.say.call(my_obj,’Dude’);
“Haya Dude,I am a Scripting guru”
成功了。这是为什么呢?由于我们在调用say()函数的对象方法call()是传递了两个参数:对象my_obj和字符串“Dude”。这样一来,当say()被调用时,其中的this就被自动设置成了my_obj对象的引用。因而我们看到,this.name返回的不在是“Ninja”,而是“Scripting guru”了【实际上就是通过call的首参数修改了对象函数的this值】。
如果我们调用call方法时需要传递更多的参数,可以在后面一次加入它们:
some_obj.someMethod.call(my_obj,’a’,’b’,’c’);
另外,如果我们没有将对象传递给call()的首函数,或者传递给它的是null,它的调用对象将会被默认为全局对象。
apply()的工作方式与call基本相同,唯一的不同之处在于参数传递形式,这里目标函数所需要的参数都是通过一个数组来传递。所以,下面两行代码的作用是等效的:
some_obj.someMethod.apply(my_obj,[‘a’,’b’,’c’]);
some_obj.someMethod.call(my_obj,’a’,’b’,’c’);
因而,对于之前的示例,我们也可以这样写:
some_obj.say.apply(my_obj,[‘Dude’]);
“Haya Dude,I am a Scripting guru”

2.bind()函数

bind()

0 0
原创粉丝点击