关于_this.cancel && _this.cancel.call(_this,e)
//初始化一个弹出框
//生成dom元素
//插到页面中
//显示
(function(window,document){
let Msg=function(options){
this.init(options);
};
Msg.prototype.init= function({content,cancel=null,confirm=null}) {
this.content=content;
this.cancel=cancel;
this.confirm=confirm;
this.createElement();
this.bind([this.el,this.overlay]);
this.show([this.el,this.overlay]);
}
Msg.prototype.createElement=function(){
let wrap=document.createElement('div');
wrap.className='msg__wrap';
wrap.innerHTML="<div class='msg-header'>\
<span>确认删除</span>\
<span class='msg-header-close-button'>×</span>\
</div>\
<div class='msg-body'>\
<div class='msg-body-icon'>\
<div class='msg-body-icon-wrong'></div>\
</div>\
<div class='msg-body-content'>是否删除</div>\
</div>\
<div class='msg-footer'>\
<button class='msg-footer-btn msg-footer-cancel-button'>算了吧</button>\
<button class='msg-footer-btn msg-footer-confirm-button'>好的</button>\
</div>";
let overlay=document.createElement('div');
overlay.className='msg__overlay';
this.el=wrap;
this.overlay=overlay;
}
Msg.prototype.bind=function([el,overlay]){
const _this=this;
const hideMsg=function(){
el.style.transform="translate(-50%,-50%) scale(0,0)";
overlay.style.opacity='0';
setTimeout(function(){
document.body.removeChild(el);
document.body.removeChild(overlay);
},300)
}
const cancel=function(e){
console.log(this);
console.log(_this);
/*_this.cancel && _this.cancel.call(_this,e);*/
_this.cancel();
hideMsg();
}
const confirm=function(e){
hideMsg();
}
overlay.addEventListener('click',cancel);
el.querySelector('.msg-header-close-button').addEventListener('click',cancel);
el.querySelector('.msg-footer-cancel-button').addEventListener('click',cancel);
el.querySelector('.msg-footer-confirm-button').addEventListener('click',confirm);
};
Msg.prototype.show=function([el,overlay]) {
document.body.appendChild(el);
document.body.appendChild(overlay);
setTimeout(function(){ //等所有同步任务执行完之后再执行
el.style.transform="translate(-50%,-50%) scale(1,1)";
overlay.style.opacity='1';
});
}
window.$Msg=Msg;//使这个函数在全局下可以访问
})(window,document);//传入window和document可以避免再往外搜索一层,性能更优
问题:老师,_this.cancel && _this.cancel.call(_this,e)为什么要这么写,如果只是想要执行用户自定的函数内容,我直接执行 _this.cancel();不就行了吗,
_this.cancel.call(_this,e)这一句不理解,将_this.cancel的方向指向_this?可是为什么要这么写呢,还有那个e,我知道是事件对象,但是为什么要这么传?
正在回答 回答被采纳积分+1
同学你好,解答如下:
1_this.cancel && _this.cancel.call() 是逻辑与表达式,当第一个操作数可以转换为true,返回第二个操作数。如果转换为false,就不返回第二个操作数,即不会调用了。直接写_this.cancel();,当cancel没有传递实参,默认值为null ,null调用就会报错了。所以写成逻辑与的方式更好。
2. call的第一个参数就是设置this的指向,这里就是让cancel方法中的this指向_this。这里传递的参数_this和e没有用上,可以不传。
如果我的回答帮助到了你,欢迎采纳,祝学习愉快~
- 参与学习 人
- 提交作业 239 份
- 解答问题 10739 个
本阶段带你深入前端开发的肌理,通过ES6基础知识和前端主流高级框架的学习,助你快速构建企业级移动webAPP应用,进入职场的终极battle
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星