关于_this.cancel && _this.cancel.call(_this,e)

关于_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回答
好帮手慕夭夭 2019-11-24 18:43:39

同学你好,解答如下:

1_this.cancel && _this.cancel.call() 是逻辑与表达式,当第一个操作数可以转换为true,返回第二个操作数。如果转换为false,就不返回第二个操作数,即不会调用了。直接写_this.cancel();,当cancel没有传递实参,默认值为null ,null调用就会报错了。所以写成逻辑与的方式更好。

http://img1.sycdn.imooc.com//climg/5dda5cd3093df71606240052.jpg

2. call的第一个参数就是设置this的指向,这里就是让cancel方法中的this指向_this。这里传递的参数_this和e没有用上,可以不传。

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师