在JavaScript中call() 与 apply()都是用来改变 this 的指向的;
-
call()与apply()的不同点与相同点
-
第一参数都是 目标对象,其他参数没有类型限制但又格式规定;
-
不同点是 call()的非第一参数用逗号分隔 '1,2,3' ,apply()的非第一参数为数组 '[1,2,3]'
-
明白了其使用方法和作用后我们就可以利用在项目开发当中了,下面举个例子:
我们在项目开发中一定会碰到 “ 点击按钮——>触发事件 ” 诸如此类需求,传统的方法呢:
//HTML
/*<button id="btn1">按钮1</button>
<button id="btn2">按钮2</button>
<button id="btn3">按钮3</button>*/
//Script JQuery
var btn1 = $('#btn1'),
btn2 = $('#btn2'),
btn3 = $('#btn3');
btn1.click(function(){
// to do something
})
btn2.click(function(){
// to do something
})
btn3.click(function(){
// to do something
})
如果使用call()函数 我们怎么处理这类时间呢?
// HTML
/*<button id="btn1" data-type="create">创建</button>
<button id="btn2" data-type="del">删除</button>
<button id="btn3" data-type="modify">修改</button>*/
// Script JQuery
let active = {
create(e) {
console.log(active);
console.log(e); //<button class="event" data-type="create">创建</button>
},
del(e) {
console.log(active);
console.log(e); //<button class="event" data-type="del">删除</button>
},
modify(e) {
console.log(active);
console.log(e); //<button class="event" data-type="modify">修改</button>
}
}
$('button').on('click', function (e) {
let eventType = e.currentTarget.dataset.type;
//第一个参数传入了 目标对象 第二个参数传入了 当前点击按钮
active[eventType] ? active[eventType].call(this, e.target) : '';
//call apply 第一个参数都必须是目标对象指针
//call apply 的区别是 其他参数 call是逗号分隔的1,2 apply第二参数是传入列表['1','2'],对参数类型没有限制
})