舒适提示:做者的爬坑记录,对你等大神彻底没有价值,别在我这浪费生命
舒适提示-续:打call本来是属于咱们偶像宅文化中的专业名词,指的是饭们在看live时在台下配合爱豆演出的节奏喊口号,举例:“超绝可爱~TJY!!!”如今被各类滥用,我很蛋疼javascript
在javascript中有两个常被提起的神奇函数,传说中的call()
和apply()
先看看文档中的定义
JavaScript标准库 - Function.prototype.call()
JavaScript标准库 - Function.prototype.apply()java
call() 方法调用一个函数, 其具备一个指定的this值和分别地提供的参数(参数的列表)。
注意:该方法的做用和 apply() 方法相似,只有一个区别,就是call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组。
从上面段话,我get到两点:1.这不是人话 2.貌似整明白call()
就约等于整明白apply()
了
那我就一条一条攻略吧segmentfault
语法
fun.call(thisArg, arg1, arg2, ...)参数
thisArg:
在fun函数运行时指定的this值。须要注意的是,指定的this值并不必定是该函数执行时真正的this值,若是这个函数处于非严格模式下,则指定为null和undefined的this值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。
arg1, arg2, ...:
指定的参数列表。数组返回值
返回值是你调用的方法的返回值,若该方法没有返回值,则返回undefined。浏览器
参考文档中的说明,咱们能够这样理解,call()
的做用实际上就是在改变函数运行的this
结合call的词面意思来理解,就是喊来thisArg
来做为fun
的this
,直白点能够理解为,老王有洗衣服的这个方法,他给老张打电话让他来洗衣服,老张自己是(maybe)不会洗衣服的,可是由于这通电话他就要去洗了。app
这样就好理解了,call()
的两个(类)参数,第一个是要执行函数/洗衣服的this(对象)/老张,从第二个开始是这个函数的参数/要洗哪些衣服,而返回值就是这个方法自己的返回值/凉到阳台函数
再往简单的理解一下,call()
的执行,其实就是在执行fun
自己,只不过改变了执行这个函数的对象(this)this
弄明白(maybe)call()
的定义以后,脑中又浮现出了那个阴魂不散的题目prototype
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()());//The Window
详情在个人另外一片文章javascript对象不彻底探索记录01:this! which?- lskrat中
这题让人懵逼的缘由,就是这里面的this究竟是which,出现“The Window”的缘由说究竟是由于执行object.getNameFunc()
的是Window
对象code
因此为了可以获得期待的结果,是否是能够经过call()
喊来object本身来执行呢,这就试试!
alert(object.getNameFunc().call(object));//My Object
真是效果拔群到想为call()
打call!如此显著的疗效,都能用在哪呢?
我就来试着总结一下call()
都有什么用处吧//本章节陆续补充
1.防止懵逼,指定this
这条的来源,看过上文就都知道了,对this
目标懵逼的同窗们,能够用call()
来直接指定this
,就让你来执行!
举例:见上文
2.实现继承
继承,做为面向对象语言的基础特性,在javascript中有不少的实现方式,其中一种就是用call()
function Food(name, price) { this.name = name, this.price = price, this.getPrice = function() { console.log("吃一份" + this.name + "须要" + this.price + "块钱!贫穷使的我保持身材") } } function RouJiaMo() { Food.call(this, "肉夹馍", 5); } var rouJiaMo = new RouJiaMo() rouJiaMo.getPrice();//吃一份肉夹馍须要5块钱!贫穷使得我保持身材
在建立实例rouJiaMo
时,将Food()
中的this
换成了RouJiaMo
,这也就在使得rouJiaMo
不但能够拥有和Food
中同样的内部变量并赋值,而且能够调用其内部函数,从而造成了继承