不知不觉已经干前端开发两年了,两年里感觉自己都没啥进步;准备跳槽吧,又没有什么资本;不跳吧,是要被饿死的节奏;没办法,给自己充充电,学习喽!
之前总是看到好多面试题里都有call()和apply();但是一直感觉很模糊,不清楚这个到底是个啥;感觉自己开发中好像也没有用到啊,怎么办,为了通过面试拿到高薪,就硬着头皮学吧!
call()和apply()在JavaScript中的作用是一样的;
1:相同点:都是用来改变this指向的;可以通过改变this的指向来实现对象的继承;
2:不同点:call的语法:函数名.call(obj,参数1,参数2,参数3……);参数是一一列举出来的;
apply的语法:函数名.apply(obj,[参数1,参数2,参数3……]);参数是数组或者类数组;
首先得提一下这个this; 在JS中它是一个指向性的变量;指向它的所属值;那到底它是属于哪个呢;举个例子
下面的代码中我们在函数abc()中打印this.a最后得出的结论是八戒而不是翠花,为什么呢;八戒表示很纳闷;其实不难理解;八戒是一个全局变量,在它申明的时候就会被绑在window对象上,函数abc()也是一样;所以说此处的this.a === window.a;那必然就是八戒喽
好了,在说说call()和apply()吧
下面列子中先构造一个product函数,给它添加名称和价钱的属性;在构造一个food函数,我如果想在food函数里应用product的name和price属性怎么办,拿到要在写一遍吗?当然不是,这时候就可以用call()或者apply()来做这个事情; Product.call(this, name, price);this就是指product函数喽,这样food函数通过call(),也就可以继承product函数里的属性了;
总结:
1 call的语法:函数名.call(obj,参数1,参数2,参数3……);
2 apply的语法:函数名.apply(obj,[参数1,参数2,参数3……]);
这两个东西功能相同,就是把一个函数里面的this设置为某个对象,区别就是后面的参数的语法。call需要使用逗号分隔列出所有参数,但是apply是把所有参数写在数组里面。需要注意的是即使只有一个参数,也必须写在数组里;
-------------------------------------欢迎各位大神指正补充-----------------------------------