js——this详解

认识上下文:函数上下文this指待啥由函数调用方式决定

认识上下文之上下文规则1

上下文规则:1.对象打点其方法函数,则函数的上下文就是这个打点的对象 对象.方法()
四个小例题

在这里插入代码片
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>上下文规则</title>
</head>

<body>
    <script>
        // 上下文规则1:对象打点调用其方法函数,则函数上下文就是打点的对象
        // 习题1
        function fn() {
            console.log(this.a + this.b); //this-obj
        }
        var obj = {
            a: 1,
            b: 2,
            fn: fn
        }
        obj.fn()

        // 习题2
        var obj1 = {
            a: 1,
            b: 2,
            fn: function () {
                console.log(this.a + this.b); //this-obj2
            }
        }
        var obj2 = {
            a: 3,
            b: 4,
            fn: obj1.fn
        }
        obj2.fn()

        // 3.
        function outer() {
            var a = 1
            var b = 2
            return {
                a: 3,
                b: 4,
                fn: function () {
                    console.log(this.a + this.b); //this——outer执行结果
                }
            }
        }
        outer().fn()

        // 4.
        function fun() {
            console.log(this.a + this.b); //this-{a:3,b:4,c:fun}
        }
        var obj3 = {
            a: 1,
            b: 2,
            c: [{
                a: 3,
                b: 4,
                c: fun
            }]
        }
        var a = 5;
        obj3.c[0].c()
    </script>
</body>

</html>

上下文使用规则2

2.圆括号直接调用,则函数上下文就是window对象 方法()
例题1

在这里插入代码片
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>上下文规则2</title>
</head>

<body>
    <script>
        // 使用规则2:圆括号直接使用,函数上下文this是window对象
        // 习题1
        var obj1 = {
            a: 1,
            b: 1,
            fn: function () {
                console.log(this.a + this.b); //this-window
            }
        }
        var a = 3
        var b = 4
        var fn = obj1.fn
        fn(); //圆括号直接调用,this-window
    </script>
</body>

</html>

例题2

在这里插入代码片
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=sc, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 习题2:好题
        function fun() {
            return (this.a + this.b);
        }
        var a = 1
        var b = 2
        var obj2 = {
            a: 3,
            b: fun(), //b=3 因为fun()符合规则2,然后fun()执行结果:a+b=3
            fun: fun
        }
        console.log(obj2.fun());
    </script>
</body>

</html>

3上下文规则三

3.数组(类数组对象)枚举出函数进行调用,则上下文就是数组(类数组对象) 数组名index

在这里插入代码片
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>上下文规则3</title>
</head>

<body>
    <script>
        // 上下文规则3:数组(类数组对象)枚举出函数进行调用,上下文对象就是该数组(类数组对象)
        // 类数组对象:所有键名从0开始,且待length属性的对象
        // 比如:arguments对象,它是函数的实参列表

        // 习题1
        var arr = [1, 2, 3, function () {
            console.log(this[0]); //this-arr
        }]
        arr[3](); //数组名[index]()

        // 习题2:好题
        function fun() {
            arguments[3]()
        }
        fun(1, 2, 3, function () {
            console.log(this[2]); //this-arguments
        })
    </script>
</body>

</html>

上下文规则四

4.IIFE中的函数,上下文是window对象 IIFE:立即可执行函数:(function(){})()

在这里插入代码片
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>上下文规则4</title>
</head>

<body>
    <script>
        // 上下文规则4:IIFE的函数,上下文是window对象
        // IIFE:立即可执行函数 (function(){})()

        // 习题1:好题
        var a = 1
        var obj = {
            a: 2,
            fun: (function () {
                var a = this.a //规则四: this-window
                return function () {
                    console.log(a + this.a); //规则1:this-obj
                    //1+2
                }
            })()
        }
        obj.fun() //规则1
    </script>
</body>

</html>

上下文规则五

5.定时器、延时器调用函数,上下文是window对象 setInterval(函数,时间) setTimeout(函数,时间)

在这里插入代码片
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>上下文规则5</title>
</head>

<body>
    <script>
        // 上下文规则5:使用定时器\延时器调用函数,上下文是window对象 setInterval(函数,时间) setTimeout(函数,时间)

        // 习题1
        var obj = {
            a: 1,
            b: 2,
            fun: function () {
                console.log(this.a + this.b); //this-window
            }
        }
        var a = 3
        var b = 4
        setTimeout(obj.fun, 2000) //规则5
        // 习题2
        setTimeout(function () {
            obj.fun() //规则1
        }, 2000)
    </script>
</body>

</html>

上下文规则6

6.事件处理函数的上下文是绑定事件的DOM元素 DOM元素.绑定事件=fuction(){}

在这里插入代码片
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>上下文规则6</title>
    <style>
        .box {
            width: 100px;
            height: 100px;
            border: 1px solid #000;
            margin: 10px;
        }
    </style>
</head>

<body>
    <!-- 上下文规则6:事件处理函数的上下文就是事件绑定的DOM元素 DOM元素.绑定事件=处理函数 -->
    <!-- DOM元素.绑定事件=function(){} -->

    <!-- 习题1:点击哪个盒子哪个盒子就变红,要求使用同一个事件处理函数 -->

    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>

    <script>
        var boxs = document.getElementsByClassName('box')
        // 习题1:点击哪个盒子哪个盒子就变红,要求使用同一个事件处理函
        // for (var i = 0; i < boxs.length; i++) {
        //     boxs[i].onclick = fun

        //     function fun() {
        //         this.style.backgroundColor = 'red' //this-boxs[i]
        //     }

        // }

        // 习题2;点击哪个盒子哪个盒子就在1000ms后变红,要求使用同一个事件处理函数 好题
        for (var i = 0; i < boxs.length; i++) {
            boxs[i].onclick = fun

            function fun() {
                // 备份上下文 重点
                var _this = this //boxs[i]点击后this是boxs[i],将这个this备份起来
                setTimeout(function () {
                    _this.style.backgroundColor = 'green' //_this---boxs[i]
                }, 1000)
            }
        }
    </script>
</body>

</html>

call 和apply可以指定上下文

call和apply能指定函数的上下文 函数.call(上下文,参数) 函数.apply(上下文,参数) 区别:函数带参时,call用逗号罗列参数,apply以数组的形式传入零散值

在这里插入代码片
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>call 和apply可以指定上下文</title>
</head>

<body>
    <!-- 函数.call(上下文)  函数.apply(上下文)-->
    <script>
        function fun1() {
            fun2.apply(this, arguments) //函数.apply(上下文) this-33,44
        }

        function fun2(a, b) {
            console.log(a + b);
        }
        fun1(33, 44); //圆括号直接调用,this-window对象
    </script>
</body>

</html>

上下文规则总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值