JavaScript之this指向小案例

示例1:

<script>
        //this指向问题
        var name = '222';
        var a = {
            name: '111',
            say: function() {
                console.log(this.name); //222
            }
        }

        var fun = a.say;

        fun();

        a.say(); //111

        var b = {
            name: '333',
            say: function(fun) {
                fun(); //this--b
                //此时fun()--function() {console.log(this.name);}()
            }
        }

        b.say(a.say); //a.say--function() {console.log(this.name);} 222
        b.say = a.say;
        b.say(); //333
</script>

示例2:

<script>
        var foo = 123;

        function print() {
            this.foo = 234; //此时这里的this指向window即全局,也就是相当于将原来的123改为了234
            console.log(foo);
        }
        print();
</script>

示例3:

<script>
        var foo = 123;

        function print() {
            //var this = Object.create(print.prototype);
            this.foo = 234; //此时this则为Object.create(print.prototype);,并不指向window
            console.log(foo); //而结果需要打印的是foo并不是this上的foo,因此则会向上找到,找到var foo=123
        }
        new print();
</script>

示例4:

 <script>
        var a = 5;

        function test() {
            a = 0;
            console.log(a);
            console.log(this.a);
            var a;
            console.log(a);
        }
        test(); // 0 5 0
        new test(); // 0 undefined 0
</script>

示例5:

<script>
        function print() {
            var marty = {
                name: "marty",
                printName: function() {
                    console.log(this.name);
                }
            }

            var test1 = {
                name: "test1"
            };

            var test2 = {
                name: "test2"
            };

            var test3 = {
                name: "test3"
            };

            test3.printName = marty.printName;

            var printName2 = marty.printName.bind({
                name: 123
            });

            marty.printName.call(test1); //test1
            marty.printName.call(test2); //test2
            marty.printName(); //marty
            printName2(); //123
            test3.printName(); //test3
        }
        print();
</script>

示例6:

<script>
        var bar = {
            a: '123'
        };

        function print() {
            bar.a = 'a';
            Object.prototype.b = 'b'; //
            return function inner() {
                console.log(bar.a); //a
                console.log(bar.b); //b
            };
        }

        print()();
</script>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白小白从不日白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值