美文网首页
5.1 JS中this关键字和函数作用域

5.1 JS中this关键字和函数作用域

作者: 不会忘的名字 | 来源:发表于2021-10-22 11:05 被阅读0次
<script type="text/javascript">
    $(function () {
        /**
        1.变量的作用域
          闭包: 函数内定义的任何变量 或者函数,包裹它们的外层函数提供一个沙箱环境, 俗称闭包.
              一般该函数体以外 都无法访问这些变量 或者函数
          局部变量: 一般把函数内定义的任何变量,称之局部变量,作用域限于该函数内.
          全局变量: 放在一个Js文件或者在script标签最外层,jq最外层的变量
         */
        //在jq全局变量, 可以在任何位置访问
        let myLibrary = {
            myName: "Chris Lu"
        };

        function doSomething(){
            //局部变量: 函数体内定义的变量
            let innerVar = 1234;
            //全局变量可以在函数中访问
            myLibrary.myName = "Hello, Lu";

            function elseSomething() {
                //外层函数定义局部变量, 能在内层函数访问到
                console.log(innerVar);
            }
            elseSomething();
        }
        //调用函数
        doSomething();
        //函数内部覆盖了 全局变量myLibrary.myName属性
        console.log(myLibrary.myName);

        //在函数外层 不能访问该函数的局部变量

        /**
         * 2.js闭包
         * 匿名函数作为fn的返回值被赋值给了fn1,这时候相当于fn1=function(){var n = 0 … },并且匿名函数内部引用着fn里的变量num,
         * 所以变量num无法被销毁,而变量n是每次被调用时新创建的,所以每次fn1执行完后它就把属于自己的变量连同自己一起销毁,于是乎最后就剩下孤零零的num,于是这里就产生了内存消耗的问题
         */
        function fn() {
            let num = 3;
            return function () {
                let n = 0;
                console.log("n:",++n);
                console.log("num:",++num);
            }
        }
        let fn1 = fn();
        //闭包产生内存消耗, 调用过程中, 外层函数局部变量内存无法被释放
        fn1(); //n: 1, num: 4
        fn1(); //n: 1, num: 5

        /**
         * 定时器与闭包
         * 1.定时器内部 按顺序打印出当前循环次数
         *   for循环变量 使用let定义就可以解决
         * 2.每隔100毫秒分别依次输出数字
         */
        for (let i = 0; i < 5; i++) {
            setTimeout(function () {
                //console.log("i=",i);
            },100);
        }

        //没隔1000毫秒输出数字
        for (let j = 0; j < 5; j++) {
            (function (j) {
                setTimeout(function () {
                    console.log("j=",j)
                },j*2000);
            })(j)
        }

        /**
        3.上下文this关键字
         1).在普通函数之外this, script标签内this指代window, 在jq包裹内this指代document.
         2). fn2()函数在没有对象包裹情况下, this指向 全局对象window; 放在对象包裹中话, this指向该对象
         */
        console.log("this指代document:",this === document);

        function fn2() {
            console.log("fn2的this",this === window);
        }
        fn2();

        /**
         * 对象中this指向: 对象中简单函数, this就是指向对象本身.
         */
        let house = {
            floors: 2,
            isLocked: false,
            lock: function () {
                console.log("简单函数this:",this===house); //true,this指向包裹该函数的对象
                //可以把this看做house的替身
                this.isLocked = true;
            }
        };
        house.lock();
        console.log("isLocked通过this改变:",house.isLocked);
        /**
         * 对象中的嵌套函数,this指向的是包裹该对象的外层全局window对象
         * 想绕过该陷阱, 对象中函数嵌套, 一般将this的值保存在一个变量中, 利用该变量来代替this -- that变量
         */
        let apartment = {
            isLocked: false,
            lock: function () {
                let that = this;
                //设置isLocked属性
                this.isLocked = true;

                function fn3() {
                    console.log("this是否指向apartment:",this===apartment); //false
                    console.log("this是否指向document:",this===window); //true
                    console.log("that是否指向apartment:",that===apartment); //true

                    //通过that修改apartment对象isLocked属性
                    that.isLocked = false;
                }
                fn3();
            }
        };
        apartment.lock();
        console.log("apartment属性isLocked:",apartment.isLocked); //false
    });

    console.log("this指代window:",this === window);
</script>

相关文章

  • 5.1 JS中this关键字和函数作用域

  • 前端(ES6)

    1.块级作用域的引入 在ES6之前,js只有全局作用域和函数作用域,ES6中let关键字为其引入了块级作用域。 l...

  • ES6基础

    块级作用域、字符串、函数 作用域在之前的js中,只有函数作用域和全局作用域,指的是变量只能在函数中或者全局中,块级...

  • js 闭包

    一、js 作用域 讲闭包首先就要理解 js 的作用域。再 ES5 中,js 有两种作用域,全局作用域和函数作用域(...

  • ES5中JS的作用域和变量提升(hoisting)

    ES5 中JS 的作用域: 在ES5 中,JS 只有两种形式的作用域:全局作用域和函数作用域。 全局作用域全局对象...

  • JS作用域链

    1. 作用域 JS中的变量和函数并不总是可用的,有其使用的范围,这就是作用域。 JS的作用域靠函数形成,函数内声明...

  • 作用域链&闭包&函数相关

    作用域链 在JS中函数可以创建作用域; 函数中又可以创建函数(可以开辟新的作用域); 函数内部的作用域可以访问外部...

  • js 变量提升和函数提升

    在js中只有两种作用域,全局作用域和函数作用域,在ES6之前,js是没有块级作用域。 JavaScript 代码的...

  • 函数的作用域

    作用域:变量和函数的访问范围,作用域可以控制变量和函数的可见性和生命周期。JS中作用域分为两种:全局作用域 和 局...

  • 09-第九章 作用域 js预解析 闭包

    一、作用域 top 和 left 在全局作用域是关键字,在函数作用域不是关键字 作用域:脚本的有效范围,作用范围...

网友评论

      本文标题:5.1 JS中this关键字和函数作用域

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