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

<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>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,881评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,052评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,598评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,407评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,823评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,872评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,037评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,778评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,505评论 1 247
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,745评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,233评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,231评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,141评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,939评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,954评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,784评论 2 275

推荐阅读更多精彩内容