问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

javascript里的this用法指正

发布网友 发布时间:2022-04-21 01:07

我来回答

1个回答

热心网友 时间:2022-04-18 02:40

<style>

div {
    background-color:black;
    width:50px;
    height:50px;
    margin:20px;
}
.state1 {
    background-color:blue;
}
.state2 {
    background-color:red;
}

</style>

<script>

function Test(div) {
    this.counter = true;
    this.div = div;
    var _this = this;
    
    //this.div.onclick=_this.onclick();    <-----问题在这
    
    this.div.onclick = function () {
        _this.onclick.call(_this);
    };
};
Test.prototype.onclick = function() {
    if(this.counter){
        this.div.className = "state1";
    }
    else {
        this.div.className = "state2";
    }
    this.counter = !this.counter;
};
window.onload = function() {
    var oDiv1 = document.getElementById("div1");
    var oDiv2 = document.getElementById("div2");
    var ot1 = new Test(oDiv1);
    var ot2 = new Test(oDiv2);
};

</script>


根据你的意图,你的代码应该有2处需要用到this,一个是构造函数,一个是onclick的绑定事件函数:

    构造函数内this指向实例;   

    绑定事件函数this指向触发事件的dom;


但是实际上你的代码有三处用到了this。

    构造函数内this指向实例;

    原型成员函数this指向实例;

    绑定事件函数this指向触发事件的dom;


所以代码产生了一些多余的现象(2个div都变蓝),让你的概念稍微混乱了一下。

之所以会触发原型成员函数是因为你在注释行:this.div.onclick=_this.onclick(); 出现了问题。

使用onclick绑定事件函数的用法是:[object Element].onclick = [object Function];

比如:document.getElementById('ele').onclick = clickFunction; function clickFunction(){};

所以你需要赋值的是一个函数: _this.onclick;

而不是一个函数调用: _this.onclick(); 这个在以后写代码需要注意。


点击无效果的原因也是上述原因,为事件绑定一个函数,触发事件的时候会调用函数;

然后你赋值的是一个函数调用 =>> 函数调用会返回一个返回值,无返回值则返回undefined =>> 触发事件的时候没有检测到函数 =>> 自然后不执行任何代码 =>> 所以点击无效果


之所以需要多一个function,然后执行call,是因为你的Test.prototype.onclick需要用到实例的其他属性。那么this则需要指向实例而不是触发事件的dom元素。但是绑定事件函数的this一定指向dom元素,所以需要多一个function处理this指向dom,调用Test.prototype.onclick的时候需要通过call强行指向实例。


完毕。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小米平板6Max没有网络怎么办 ...wifi和4G网络我都试过都现实吗没有网络。刚买的是正品没有刷机_百度... 2023年淘宝双11招商规则 淘宝国庆狂欢季招商规则及玩法 淘宝年货买不停招商规则 淘宝超来电活动招商规则 ZIP转换成RAR怎么转换? 衢州醉根艺品有限公司怎么样? 徐谷青主要业绩 徐谷青人物介绍 js中this代表什么意思? 理解Javascript中this是什么1 JAVAscript里面this的用法谁能举个例子啊 Javascript中“this” 的作用? javascript自定义对象中this的用法 javascript中this的意思 如何更好的理解js中的this,分享2段有意思的代 js当中this什么用法 如何理解 JavaScript 中的 this 关键字 javascript中的this到底指什么? JavaScript脚本中的this用法详细诠释? 怎么把金山毒霸卸载了 我删除也删除不了啊 金山毒霸企业版5.2卸载需要密码,如何才能卸载? 怎样完全卸载金山毒霸?卸载不了金山毒镖? 金山毒霸如何卸载 怎样才能完全的卸载金山毒霸 金山毒霸怎么卸载 金山毒霸卸载的方法 正确卸载金山毒霸的步骤 如何卸载金山毒霸软件? 安装了企业版,客户端上金山毒霸软件卸载方法! 鲁刚的《老厂》 歌词 javascript中各个地方的this指什么 JS中this关键字的解释 JavaScript 函数作用域 this javascript什么意思 如何排查C1下的网络环路? 防狼喷雾能过机场安检吗? 上飞机出国 可以带防狼喷雾吗 你好,防狼喷雾真的能带上飞机吗? 什么东西可以作防身利器又可以带上飞机? 防狼喷雾剂 能带上飞机吗? 老师,您好,我有几个问题想请教您 防狼喷雾60毫升,坐飞机可以放在行李箱里托运吗 防狼喷雾可以上飞机吗? 有什么防身用品可以带上飞机? 防狼报警器不能带上飞机么 要去欧洲旅游了 能将防狼报警器带出国吗 能过安检吗 在机场带了防狼喷雾,被罚款1000这是为什么 防狼喷雾管用吗? 防狼手电筒电击棒电棒可以上飞机吗?