IIFE立即执行函数和JS基础中的this及练习题

本文详细讲解了JavaScript中this的关键概念,包括IIFE中的this行为、普通函数、监听器、方法中的this指向,以及各种场景下的this练习题。深入理解this在不同上下文中的变化,对于提升编程技能至关重要。
摘要由CSDN通过智能技术生成

一、IIFE立即执行函数

普通函数:

<script>
    // 先声明
    function fn(){
        console.log("fn...");
    }
    // 后调用
    fn()
</script>

立即执行函数:

<script>
    //如果这样直接调用会报错  SyntaxError: Unexpected token ')'
    // function gn(){
    //     console.log("gn...");
    // }()


    // IIFE 的写法:
    (function kn(){
        console.log("kn...");
    }())

    // // IIFE
    // +function kn(){
    //     console.log("kn...");
    // }()

    // IIFE
    // -function kn(){
    //     console.log("kn...");
    // }()

    // !function kn(){
    //     console.log("kn...");
    // }()

    // IIFE
    // (function mn(){
    //     console.log("mn...");
    // })()

    // 普通的对象
    let obj = {
        name:"wc",
        age:100
    }
    // IIFE
    ;(function mn(){
        console.log("mn...");
    })()
    // 输出普通对象
    console.log(obj);
</script>

二、this


  • (1)如果this出现在一普通的函数中,通过window.f调用此函数,那么里面的this就表示window。就看.前面是谁,那么this就表示谁 window.f() f中的this就表示window
  • (2)事件绑定中 监听器中的this表示事件源
  • (3)对象是属性的无序集合 在一个对象中也可以能函数 如果一个函数出现在对象中 这个函数叫方法。通过对象打点调用了方法,那么这个方法中的this表示这个对象 就看.前面是谁,那么this就表示谁。
  • (4)在IIFE(立即执行函数)中,this表示window
  • (5)在严格模式和非严格模式下,this代表的含义是不一样的 严格模式后面说
  • (6)一片代码中有this,谁也不知道this代表什么含义,只能代码执行起来后,才知道this表示什么。

三、this练习题

1.this出现在普通函数中

<script>
    // this出现在普通的函数中
    function fn() { 
        // 此时this表示window
        console.log(this)
    }
    fn()
    window.fn()
</script>

在这里插入图片描述

2.this出现在监听器中

<button onclick="fn">登录</button>
<script>
    let btn = document.getElementsByTagName("button")[0]
    btn.onclick = function(){
        // 在监听器中,this表示事件源
        console.log(this)
    }
</script>

在这里插入图片描述

3.this出现在方法中

<script>
    let obj = {
        name: "wangcai",
        age: 100,
        // this出现在方法中
        // run叫方法  函数
        run: function () { 
            // this表示当前的对象
            // this代表是谁,你就看.前面是谁,
            // this代表什么谁,只有去调用此方法时,才知道this是谁
            console.log(this)
            console.log("run....")
        }
    }
    // .前面是obj,代表this是obj
    obj.run()
</script>

在这里插入图片描述

4.this出现在IIFE函数中

<script>
    ; (function f() {
        console.log(this); 
    }())
</script>

在这里插入图片描述

5.关于this的其他练习题

(1)

<button id="box">点击</button>
<script>
    let btn = document.getElementById("box");
    function f() { 
        console.log(this);  // window
        // return undefined
    }
    // f() 表示函数的返回值
    btn.onclick = f(); 
</script>

在这里插入图片描述
(2)

<button id="box">点击</button>
<script>
    let btn = document.getElementById("box");
    function f() {
        return function () {
            console.log(this)
        }
    }
    btn.onclick = f();
</script>

在这里插入图片描述
(3)

<script>
    // this出现在普通的函数,this表示window
    function qq() {
        console.log(this); 
    }
    window.qq();
    qq(); 
</script>

在这里插入图片描述
(4)

<script>
     let wc = {
        name: "wangcai",
        age: 100,
        // this出现在方法中,就看谁调用了这个方法
        eat: function () { 
            console.log("eat...")
            console.log(this); 
        }
    }
    wc.eat(); 
</script>

在这里插入图片描述
(5)

<script>
    let wc = {
        name: "wangcai",
        age: 100,
        eat: function () {
            console.log("eat...")
            // this是谁,不调用,谁也不知道
            console.log(this); 
        }
    }
    let mm = wc.eat;
    mm(); 

</script>

在这里插入图片描述
(6)

<script>
    // num也在GO中,此num已变成了60  num又变成了65
    var num = 10;
    var obj = {
        num: 20
    }
    obj.fn = (function (num) {  // 形参num 值是20
        // this.num = 60
        // IIFE中的this表示window
        this.num = num * 3; // GO中的num变成了60
        // num++ 让num的值加1  21
        num++;
        // log(num)  21
        console.log(num);
        return function (n) {  // n是5
            // this.num = this.num + n;
            this.num += n;
            // 父函数的EC中的num变成了22
            num++;
            console.log(num)
        }
    })(obj.num);  // obj.num是20

    var fn = obj.fn;
    // 
    fn(5)
    console.log(window.num);
    // ==> 21  ==>22   ==>65 
</script>

在这里插入图片描述
(7)

<script>
    // num变成了60
    var num = 10;
    var obj = {
        // num变成了30
        num: 20
    }  // ===> 21  ===> 22  ==> 60   ==> 60   ==> 30
    obj.fn = (function (num) {  // num是20
        // this是window  让GO中的num变成了60
        this.num = num * 3;
        // AO中的num变成了21
        num++;
        // 输出num 21  num变成了22
        console.log(num);
        return function (n) {  // n是10
            // this.num = this.num + n;  this是obj
            this.num += n;
            num++;  // 找num  
            console.log(num)  // 找num 22
        }
    })(obj.num);

    obj.fn(10);
    console.log(num)
    console.log(window.num)
    console.log(obj.num)
</script>

在这里插入图片描述
(8)

<script>

    (function () {
        // AO中放了一个a值是1   a变成了2
        var a = 1;
        var obj = {
            // 要找这个10只能obj.a
            a: 10,
            f: function () {
                // a = a*2  
                a *= 2;
            }
        }
        obj.f()
        alert(obj.a + a);  
    })()

</script>

在这里插入图片描述
(9)

<script>
    (function () {
        var a = 1;
        var obj = {
            a: 10,
            f: function () {
                this.a *= 2;
                console.log(this.a)
            }
        }
        obj.f()
    })()
</script>

在这里插入图片描述
(10)

<script>
    var name = "window";
    var Wangcai = {
        name: "Wangcai",
        show: function () {
            // this是谁  看谁调用了此函数window调用了
            // this表示window  
            console.log(this.name);
        },
        f: function () {
            // this.show    this是Wangcai  找show
            var fun = this.show;
            // 
            fun();
        }
    }
    Wangcai.f();
</script>

在这里插入图片描述
(11)

<script>
    var fullname = "language";
    var obj = {
        fullname: "javascript",
        props: {
            getFullName: function () {
                // 找this  this是obj.props
                // this.name就是this.props.name
                // 访问一个对象上不存在的属性,结果是und
                return this.name;
            }
        }
    }
    console.log(obj.props.getFullName());
</script>

在这里插入图片描述
(12)

<script>

    var fullname = "language";
    var obj = {
        fullname: "javascript",
        props: {
            fullname: "hello",
            getFullName: function () {
                return this.fullname;
            }
        }
    }
    console.log(obj.props.getFullName());

</script>

在这里插入图片描述
(13)

<script>

    var fullname = "language";
    var obj = {
        fullname: "javascript",
        props: {
            fullname: "hello",
            getFullName: function () {
                // windwo调用了此函数  this表示window
                return this.fullname;
            }
        }
    }
    let qq = obj.props.getFullName;
    console.log(qq());
</script>

在这里插入图片描述
(14)

<script>
    let obj = {
        fn: (function () {
            console.log(this);  // window
            return function () {
                console.log(this);  // obj
            }
        })()
    }
    obj.fn();
</script>

在这里插入图片描述
(15)

<script>
    let obj = {
        fn: (function () {
            console.log(this)
            return function () {
                console.log(this)
            }
        })()
    }
    let qq = obj.fn;
    qq();
</script>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值