this指针

this指针

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>this指针</title>
</head>
<body>
    <script>
        window.onload = function(){
            // 默认:在严格模式下绑定到undefined,否则绑定到全局对象。
            function demo(){
                console.log(this);// Window
            }
            demo();
            function demo2(){
                "use strict"
                console.log(this);// undefined
            }
            demo2();
            var o = {};
            o.name = "xxx";
            o.print = function() {
                console.log(this.name); // xxx 指向上下文对象o
            }
            o.print();
            
            function Demo3(name){
                this.name = name; 
                console.log(this.name);// yyy 由new调用 指向新创建的对象 
            }
            
            new Demo3("yyy");


            num = 1;
            var obj = {
                num: 2,
                print: function() {
                    this.num = 3;
                    console.log(this.num); // 3 指向上下文对象obj
                    (function(){
                        console.log(this.num); // 1 没有调用者 指向全局
                    })();
                }
            }
            obj.print(); // 由上下文调用:绑定到上下文对象

            var obj2 = {
                num: 5
            };
            Demo4.call(obj2,"ddd");
            function Demo4(name) {
                this.name = name;
                console.log(this); // {num: 5, name: "ddd"} 由call、apply调用:绑定到指定对象
            }


            // 总结:
            // 1.默认绑定:严格模式下绑定到undefined,否则绑定到全局对象
            // 2.由new调用:绑定到新创建的对象
            // 3.由call、apply调用:绑定到指定对象
            // 4.由上下文对象调用:绑定到上下文对象

        }    
        // 一定要注意,有些调用可能在无意中使用默认绑定规则
        // 如果想更安全的忽略this绑定,可以使用一个空对象 比如 ø = Object.create(null); 以保护全局对象
        // ES6中的箭头函数并不会使用四条标准的绑定规则,而是根据当前的词法作用域来决定this
        // 具体来说,箭头函数会继承外层函数调用的this绑定(无论this绑定到什么)
        // 如果箭头函数外层没有函数,绑定到全局,如果箭头函数外层有函数 绑定到外层函数调用的this
        // 这其实和ES6之前代码中的self = this;机制一样
        n = 2;
        var obj2 = {
            n: 1,
            print: function(){
                console.log(this.n); // 绑定到上下文对象obj2
            },
            print2: ()=>{
                console.log(this.n); // 绑定到外层函数obj2调用的this绑定 在这里是window
            }

        }
        obj2.print(); // 1
        obj2.print2(); // 2
        console.log(this.obj2); // {n: 1, print: ƒ, print2: ƒ}


        var o1 = {
            m:1,
            print:function(){
                (()=>{
                    console.log(this.m); // 绑定到外层函数print调用的this绑定 在这里是o1
                })()
            }
        }
        o1.print();
    </script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值