菜鸟教程个人学习心得03_JavaScript的this用法

JavaScript的this用法

  1. 方法中使用this:
    示例代码:在对象的方法中使用this,如下面代码中在student这个对象的showMessage方法中使用this,则this指向这个方法的对象,即student。
<!-- 方法中使用this -->
    <p>方法中使用thisthis指向的是该方法所属于的对象</p>
    <p id="p1"></p>
    <script>
        // 创建对象
        var student = {
            name : "张三",
            sex : "男",
            age : "17",
            // 创建对象方法showMessage
            showMessage : function(){
                // 这里的this是直接只想student这个对象的,因此this.name是指向"张三",显示的也是张三。
                return "姓名:" + this.name + ",<br>性别:" + this.sex + ",<br>年龄:" + this.age; 
            }
        }
        // 调用对象方法,将信息显示在id为p1的段落标签内
        document.getElementById("p1").innerHTML = student.showMessage();
    </script>

运行截图:
在这里插入图片描述

  1. 单独使用this:
    示例代码:单独使用this,下面例子将this单独使用,将其赋值给x,则this指向的是全局变量,即为window,显示的结果就是[object Window]
 <!-- 单独使用this -->
    <p>单独使用this,则this指向的是全局对象,浏览器的全局对象为window,即为[object Window]</p>
    <p id="p2"></p>
    <script>
        // 单独使用this,将其赋给x,则指向的是全局变量,window就是该全局对象为[object Window]
        var x = this; 
        document.getElementById("p2").innerHTML = x ; 
    </script>

运行截图:
在这里插入图片描述
严格模式下,this单独使用也是指向全局对象

  1. 函数中使用this:
    示例代码:在函数中使用this,函数的所属者自动绑定this,相当于在对象中使用this,参考第一种情况,this在对象student的函数中使用,this指向的是student这个对象,因为函数的所属者是student,在这里,由于函数的所属者是window,所以this绑定的也是window,显示的结果是[object Window]
    <!-- 在函数中使用this -->
    <p>在函数中使用thisthis自动绑定函数的所属者</p>
    <p id="p3"></p>
    <script>
        function thisFunction() {
            return this;
        }
        document.getElementById("p3").innerHTML = thisFunction();
    </script>

运行截图:
在这里插入图片描述

  1. 严格模式中,函数使用this:
    示例代码:严格模式下,由于严格模式不允许默认绑定,所以this不能指向全局对象window,即在严格模式下,函数使用this,是没有自动绑定的,因此是undefined。
    <!-- 严格模式下,函数使用this -->
    <p>严格模式下,函数使用thisthis指向的是undefined</p>
    <p id="p4"></p>
    <script>
        "use strict"
        function strictThisMyfunction(){
            return document.getElementById("p4").innerHTML = this;
        }
        strictThisMyfunction();
    </script>

运行截图:
在这里插入图片描述

  1. 事件中使用this:
    示例代码:在时间中使用this,this指向的是接收事件的html元素,这里,this指向的是p元素和button元素,然后通过元素.style。display和color分别改编html元素的样式。
    <!-- 事件中使用 -->
    <p>在事件中使用thisthis指向的是接收事件的html元素</p>
    <!-- 定义一个按钮,点击后按钮消失 -->
    <button onclick="this.style.display='none'">点击按钮后按钮消失</button>
    <!-- 定义一个文本,鼠标滑过后,字体变大,颜色变红 -->
    <p onmousemove="this.style.color='red'" onmouseout="this.style.color='black'">鼠标滑过后,颜色变红</p>

运行截图:
在这里插入图片描述
点击后,按钮消失,鼠标滑动过字体时,字体变红:
在这里插入图片描述

  1. 对象方法中绑定this:
    示例代码:在对象方法中使用this,this指向的是方法的所有者,这里实在showSpeed方法中使用到this,showSpeed方法的所有者是car,因此this指的是car:
<!-- 在对象的方法中使用this -->
    <p id="p5"></p>
    <script>
        // 定义一个对象
        var car = {
            carName: "宝马",
            color: "白色",
            speed: "180km/h",
            showSpeed: function () {
                return "速度为:" + this.speed;
            }
        }
        document.getElementById("p5").innerHTML = car.showSpeed();
    </script>

运行截图:
在这里插入图片描述

  1. 显示函数中绑定this:
    首先,先看两个例子:
    例子1:全局定义age变量,并且赋值为17,在对象中有定义了一个age变量,赋值为this.age,因为在对象中使用,this指向的是对象person的所属者,也就是window,而在全局对象中已经定义了age的值,所以可以获取得到age,并且age的值为17;
    <p>在对象中使用thisthis指向的是该对象的全局变量,即window,因此访问得到可以获得age的值17</p>
    <p id="p6"></p>
    <!-- 显式函数绑定 -->
    <script>
        var name = "李四";
        var age = 17;
        var person = {
            name: "王五",
            age: this.age,
        }
        // 由于这是在对象中使用this,this指向的是对象的所有者,即全局变量,全局定义了一个age,因此调用得到age=17;
        document.getElementById("p6").innerHTML = person.age;
    </script>

运行截图:
在这里插入图片描述
例子2:在全局定义了变量age,并且赋值为17,在对象的函数方法中使用this.age,this指向的是函数的所属者,即对象person,但因为person中并没有定义age的值,因此获取不到age的值。

    <p>在对象的方法中使用this,指向的是方法的所有者,即person,因为person没有顶一age,因此无法获取age的值</p>
    <p id="p7"></p>
    <!-- 显式函数绑定 -->
    <script>
        var name = "李四";
        var age = 17;
        var person = {
            name: "王五",
            showAge: function () {
                return this.age
            }
        }
        // 调用对象person的方法
        document.getElementById("p7").innerHTML = person.showAge();
    </script>
    <hr>

实验截图:
在这里插入图片描述

对象的三个重要方法:

call()、apply()、bind() 都是用来重定义 this 这个对象的!

  1. call()、apply()和bind()方法:
    示例代码:
    <p id="p1"></p>
    <script>
        var name = "张三";
        var age = 17;
        var person1 = {
            name: "李四",
            age: this.age,
            showMessage: function () {
                return document.getElementById("p1").innerHTML = "姓名:" + this.name + "<br>年龄:" + this.age
            }
        }
        var person2 = {
            name : "王五",
            age : "18"
        }
        person1.showMessage();
        //person1.showMessage.call(person2)
    </script>

运行截图:
在这里插入图片描述
使用call()重定义this对象:

    <p id="p1"></p>
    <script>
        var name = "张三";
        var age = 17;
        var person1 = {
            name: "李四",
            age: this.age,
            showMessage: function () {
                return document.getElementById("p1").innerHTML = "姓名:" + this.name + "<br>年龄:" + this.age
            }
        }
        var person2 = {
            name : "王五",
            age : "18"
        }
        //person1.showMessage();
        person1.showMessage.call(person2)
    </script>

运行截图:
在这里插入图片描述
apply()的用法与call用法相同,不多加赘述;
bind()用法:

    <p id="p1"></p>
    <script>
        var name = "张三";
        var age = 17;
        var person1 = {
            name: "李四",
            age: this.age,
            showMessage: function () {
                return document.getElementById("p1").innerHTML = "姓名:" + this.name + "<br>年龄:" + this.age
            }
        }
        var person2 = {
            name : "王五",
            age : "18"
        }
        //person1.showMessage();
        // person1.showMessage.call(person2)
        person1.showMessage.bind(person2)();
    </script>

运行截图:
在这里插入图片描述
区别在于bind使用时要在后面加括号,可以理解为函数调用bind()。

  1. call()、apply()和bind()的传参方法
    示例代码:
    <p id="p1"></p>
    <script>
        var name = "张三";
        var age = 17;
        var person1 = {
            name: "李四",
            age: this.age,
            showMessage: function (sex) {
                return console.log("姓名:" + this.name + "   年龄:" + this.age + "   性别:" + sex);
            }
        }
        var person2 = {
            name : "王五",
            age : "18"
        }
        // person1.showMessage();
        // person1.showMessage.call(person2)
        // person1.showMessage.bind(person2)()
        person1.showMessage.call(person2,'男')
        person1.showMessage.apply(person2,['女'])
        person1.showMessage.bind(person2,['男'])()
        person1.showMessage.bind(person2,'女')()
    </script>

运行截图:
在这里插入图片描述
总结:

call传参是一个个传进去的;
apply传参是通过一个数组传参;
bind传参可以通过数组,也可以一个个传进去,但是必须要在后面加括号,类似于调用函数!!!

借鉴链接地址:https://www.runoob.com/w3cnote/js-call-apply-bind.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值