美文网首页
this、立即执行函数

this、立即执行函数

作者: 青山白衣 | 来源:发表于2018-08-08 08:49 被阅读0次
注意:每一次测试都要刷新控制台后进行

1. this 与 立即执行函数

    var obj = {
        number: 3,
        w:dd=99,
        xxx: (function () {
            console.log(this + '-----------')//立即执行函数中的this指向window,因为立即执行函数是window调用的            
            console.log(dd+'^^^^^^^^^^^')// 99
            console.log(number+'***************')// 会报错:number is not defined,后面的代码就不会执行了
            console.log(this.number + '~~~~~~~~~~~')//删除上面一行,此处this.number返回undefined
            this.number += 4;// 值为NaN(undefined+4返回NaN)
            return function () {
                console.log(this.number + '】】】】】】】】')
                this.number += 7;
                console.log(this + '++++++++++++++++++++++')
            }
        })()//立即执行函数
    }

    obj.xxx() //相当于obj.xxx.call(),所以此处的this指向obj
    console.log(obj.number) //10

程序未执行到obj.xxx()的时候,iife就已经执行了,而此!()() 可以理解为 !().call(),所以此处的this为undefined,根据浏览器的规定,this为undefined或者null时,那么默认转为window对象,所以console.log(this + '-----------')打印出来的是window对象。
iife执行完后返回一个对象。obj.xxx()相当于obj.xxx.call(),此处的this指向obj,所以iife返回的对象中的this为obj,也就是obj.xxx.call()调用的时候this为obj,obj的number为3,再+7,打印出10

2. this

示例1

<script>
    function X() {
        return object = {
            name: 'object',
            f1(x) {
                console.log('^^^^^^^^^')
                console.log(x)//此处的x为options
                console.log(this)
                console.log('^^^^^^^^^')
                console.log('】】】】】】】')
                console.log(x.f2())//会调用B,打印出options
                console.log('】】】】】】】')
                x.f2()
            },
            f2() {
                console.log('~~~~~~~~~~~~')
                console.log(this)
                console.log('~~~~~~~~~~~~')
            }
        }
    }
    var options = {
        name: 'options',
        f1() { },
        f2() {
            console.log('%%%%%%%%%%%%%%%%%%')
            console.log(this) // B
            console.log('%%%%%%%%%%%%%%%%%%')
        }
    }
    var x = X()
    x.f1(options)//可以写为: x.f1.call(x,options)    
</script>

示例2

<script>
    function X() {
        return object = {
            name: 'object',
            f1(x) {
                x.f2.call(this)
                // 这里的this是object,
                // 因为call这个this,所以options中的this被指定成了object,
                // 所以options中的this变为了object
            },
            f2() {
                console.log(this)
            }
        }
    }
    var options = {
        name: 'options',
        f1() { },
        f2() {
            console.log('%%%%%%%%%%%%%%%%%%')
            console.log(this)
            console.log('%%%%%%%%%%%%%%%%%%')
        }
    }
    var x = X()
    x.f1(options)//可以写为: x.f1.call(x,options)    
</script>

示例3

<script>
    function X() {
        return object = {
            name: 'object',
            options:null,
            f1(x) {
                console.log(111111111)
                console.log(this)
                console.log(111111111)
                this.options = x
                console.log(22222222)
                console.log(this)
                console.log(222222222)
                this.f2()
            },
            f2() {
                console.log(3333333333)
                console.log(this)
                console.log(3333333333)
                console.log(444444444444444)
                console.log(this.options)
                console.log(444444444444444)
                this.options.f2.call(this)
                //this.options 是 options,因为this.options=x 这句话。
                //options.f2.call(this),这里的this是object,因为call这个this,
                //所以options中的this被指定成了object,
                //所以options中的this变为了object
                console.log(5555555555555)
                console.log(this)
                console.log(5555555555555)
            }
        }
    }
    var options = {
        name: 'options',
        f1() { },
        f2() {
            console.log('%%%%%%%%%%%%%%%%%%')
            console.log(this)
            console.log('%%%%%%%%%%%%%%%%%%')
        }
    }
    var x = X()
    x.f1(options)//可以写为: x.f1.call(x,options)    
</script>

相关文章

网友评论

      本文标题:this、立即执行函数

      本文链接:https://www.haomeiwen.com/subject/sfszvftx.html