day10JS-this的使用规则

news2024/9/21 16:42:56

1. this情况总结

开启严格模式

 "use strict"; //开启严格模式

1.全局:非严格this--->window ,严格 this--->window。
2.普通函数执行:函数名()  非严格this-->window ,严格 this--->undefined。
3.自执行函数:非严格this-->window ,严格 this--->undefined。
4.回调函数 :非严格this-->window ,严格 this--->undefined。
   回调函数中特殊(有定时器)情况:setTimeout, setInterval  非严格this--->window ,严格 this--->window。
5.箭头函数 :没有自己的this,出现this也是指向上级上下中文中的this。
6.函数调用:看前面有没有, 有点就指向点前面的内容。
7.事件: this---->DOM元素

案例:看视频做笔记

1.全局下指的是window。

console.log(this);//Window

3.自执行的函数一般是window,严格模式下是undefined。

//'use strict';
(function () {
      console.log(this)//window
})()

4.回调函数:一般来说是window,除非在执行回调函数「内部方法」做了特殊处理。

<body>
  <div id="box">11111</div>
  <script>
    box.onclick = function () {
      console.log(this)
    }
  </script>
</body>
setTimeout(function (){
   console.log(this);
}, 1000);

6.函数调用的情况

        函数执行就看函数前有没有点,如果有,点前面是谁,this就是谁,如果没有,this就是window,或者严格模式下的undefined。

//'use strict'
function fn(){
  console.log(this)
}
fn();//这里的this就是window,在严格模式下就是undefined

var obj={
  name:"li",
  fn:fn,
}

obj.fn();//这里的this就是obj

 2.关于this的练习题

练习1:

<body>
    <script>
        var name = "培训";

        function fn() {
            console.log(this.name)
        }

        var obj = {
            name: "你好世界",
            fn: fn
        }

        obj.fn();

        fn();

        (function () {
            this.fn();
        })();
    </script>
</body>

------------------------------------
答案:你好世界  培训  培训

<body>
    <script>
        //EC(g) go: name "培训"  , obj---0x001{name: "你好世界",fn: fn}
        //      vo: fn --- 0x002
        var name = "培训";

        function fn() {
            //EC(fn)---0x002 
            //<EC(g),EC(fn)>
            //this.name---obj.name  this.name---window.name  this.name---window.name
            console.log(this.name)// "你好世界"  "培训" "培训"
        }

        var obj = {
            name: "你好世界",
            fn: fn
        }

        obj.fn();//this--obj  , "你好世界"

        fn();//this--window,"培训"

        (function () {
            //EC()----0x003
            //<EC(g),EC()>
            //this.fn()---window.fn()
            this.fn();
        })();
    </script>
</body>

练习2:

    <body>
        <script>
            var a = 10;
            function foo() {
                console.log(this.a)
            }
            foo();
        </script>
    </body>

---------------------
答案:10
    <body>
        <script>
            //EC(g)  go: a 10 
            //       vo: foo---0x001
            var a = 10;
            function foo() {
                //EC(foo)---0x001
                //<EC(g),EC(foo)>
                //this.a----window.a
                console.log(this.a)//10
            }
            foo();
        </script>
    </body>

练习3:

    <body>
        <script>
            var a = 10;
                console.log('this1', this)
                console.log(window.a)
                console.log(this.a)
            }
            console.log(window.foo)
            console.log('this2', this)
            foo();

        </script>
    </body>
-------------------------------
答案:函数体 window window 10 10
    <body>
        <script>
            //EC(g)  go:a 10
            //       vo: foo----0x001
            var a = 10;
            function foo() {
                //EC(foo)----0x001
                //<EC(g),EC(foo)>
                //this---window
                console.log('this1', this)//'this1',window
                console.log(window.a)//10
                console.log(this.a)//10
            }
            console.log(window.foo)//函数体foo----0x001
            console.log('this2', this)//'this2',window
            foo();

        </script>
    </body>

练习4:

    <body>
        <script>
            let a = 10
            const b = 20

            function foo() {
                console.log(this.a)
                console.log(this.b)
            }
            foo();
            console.log(window.a)
        </script>
    </body>

-----------------------------------
答案:undefined undefined undefined
    <body>
        <script>
            //EC(g)  go:
            //       vo: foo----0x001 , a=10, b = 20  
            let a = 10
            const b = 20

            function foo() {
                //EC(foo)----0x001
                //<EC(g),EC(foo)>
                //this.a----window.a  this.b----window.b
                console.log(this.a)//undefined
                console.log(this.b)//undefined
            }
            foo();
            console.log(window.a)//undefined
        </script>
    </body>

练习5:

    <body>
        <script>
            var a = 1
            function foo() {
                var a = 2
                console.log(this)
                console.log(this.a)
            }
            foo();
        </script>
    </body>

----------------------------------
答案:window 1
    <body>
        <script>
            //EC(g)  go: a=1
            //       vo: foo---0x001
            var a = 1
            function foo() {
                //EC(foo)---0x001
                //<EC(g),EC(foo)>
                //ao: a=2
                //this----window
                var a = 2
                console.log(this)//window
                console.log(this.a)//1
            }
            foo();
        </script>
    </body>

练习6:

    <body>
        <script>
            var obj1 = {
                a: 1
            }
            var obj2 = {
                a: 2,
                foo1: function () {
                    console.log(this.a)
                },
                foo2: function () {
                    setTimeout(function () {
                        console.log(this)
                        console.log(this.a)
                    }, 0)
                }
            }
            var a = 3

            obj2.foo1()
            obj2.foo2()
        </script>
    </body>

-------------------------------------
答案:2 window 3

   <body>
        <script>
            //EC(g)  go: obj1---0x001{a: 1} ,obj2----0x002{ a, foo1, foo2}, a=3
            //       vo:
            var obj1 = {
                a: 1
            }
            var obj2 = {
                a: 2,
                foo1: function () {
                    //EC(foo1)---0x003
                    //<EC(g),EC(foo1)>
                    //this.a---obj2.a
                    console.log(this.a)//2
                },
                foo2: function () {
                    //EC(foo2)---0x004
                    //<EC(g),EC(foo2)>
                    //this---obj2
                    //遇到定时器重定向this,重定向为this---window
                    setTimeout(function () {
                        console.log(this)//window
                        console.log(this.a)//window.a=3
                    }, 0)
                }
            }
            var a = 3

            obj2.foo1()//this---obj2
            obj2.foo2()//this---obj2
        </script>
    </body>

练习7:

    <body>
        <script>
            let obj = {
                name: "li",
                fn: (function (n) {
                    console.log(this);
                    return function () {
                        console.log(this);
                    }
                })(10),
            }
            obj.fn();
        </script>
    </body>
--------------------------

答案:window  对象obj

    <body>
        <script>
            //EC(g)  go:
            //       vo: obj----0x001 {name: "li",fn:...}
            let obj = {
                name: "li",
                fn: (function (n) {
                    //EC(fn)----0x002
                    //<EC(g),EC(fn)>
                    //ao: n=10
                    //this---obj因为是自调用函数,this重定向为---window
                    console.log(this);//window
                    return function () {
                        //EC()----0x003
                        //<EC(fn),EC()>
                        //它是普通函数,所以this---window,但是这个函数又在对象obj中,所以this---obj
                        console.log(this);//obj
                    }
                })(10),
            }
            obj.fn();//this---obj
        </script>
    </body>

练习8:

    <body>
        <script>
            function fn() {
                console.log(this);
            }
            box.onclick = function () {
                console.log(this);
                fn()
            }
        </script>
    </body>

----------------------
答案:box元素  window
    <body>
        <script>
            //EC(g)  go:
            //       vo:fn---0x001
            function fn() {
                //EC(fn)----0x001
                //<EC(g),EC(fn)>
                //this---window
                console.log(this);//window
            }

            box.onclick = function () {
                //EC()---0x002
                //<EC(g),EC()>
                //this---box
                console.log(this);//box
                fn();
            }
        </script>
    </body>

练习9:

<body>
    <script>
        var num = 10;
        var obj = { num: 20 };
        obj.fn = (function (num) {
            this.num = num * 3;
            num++;
            return function (n) {
                this.num += n;
                num++;
                console.log(num);
            }
        })(obj.num);
        var fn = obj.fn;
        fn(5);
        obj.fn(10);
        console.log(num, obj.num)
    </script>
</body>

---------------------------------
答案:22 23 65 30
<body>
    <script>
        //EC(g) go:num 10 20*3=60 60+5=65, obj---0x001{ num: 20 20+10=30} ;
        //      vo:fn---
        var num = 10;
        var obj = { num: 20 };
        obj.fn = (function (num) {
            //EC(num) ----0X002      
            //<EC(g),EC(num)>    
            //ao: num=20 21 22 23   
            this.num = num * 3; //this---window(go).num 
            num++;
            return function (n) {
                //EC(n)-----0x003    
                //<EC(num),EC(n)>  
                //ao: n=5 10        
                this.num += n; //obj.num 
                num++;//没有,找上级
                console.log(num);//22 23
            }
        })(obj.num);

        var fn = obj.fn;//EC(n)-----0x003
        fn(5);//0x003(5)=22
        obj.fn(10);//this--->obj,EC(10)-----0x003
        console.log(num, obj.num)//65 30
    </script>
</body>

 执行流程图:

练习10:

var obj = {
  name: 'obj',
  foo1: () => {
    console.log(this.name)
  },
  foo2: function () {
    console.log(this.name)
    return () => {
      console.log(this.name)
    }
  }
}
var name = 'window'
obj.foo1()
obj.foo2()()

-------------------------------
答案:window    obj   obj
    <body>
        <script>
            //EC(g)  go: obj---0x001{name: 'obj',foo1...,foo2...}
            //           name='window'
            //       vo:
            var obj = {
                name: 'obj',
                foo1: () => {
                    //EC(foo1)---0x002
                    //<EC(g),EC(foo1)>
                    //this是上级作用域window
                    console.log(this.name)//'window'
                },
                foo2: function () {
                    //EC(foo2)---0x003
                    //<EC(g),EC(foo2)>
                    //this---obj
                    console.log(this.name)//obj
                    return () => {
                        //EC()---0x004
                        //<EC(foo2),EC()>
                        //this是上级作用域
                        console.log(this.name)//obj
                    }
                }
            }
            var name = 'window'
            obj.foo1();//this---obj
            obj.foo2()();//this---obj
        </script>
    </body>

练习11:

    <body>
        <script>
            var name = 'window'
            var obj1 = {
                name: 'obj1',
                foo: function () {
                    //EC(foo)---0x003
                    //<EC(g),EC(foo)>
                    //this---obj1
                    console.log(this.name)//'obj1'
                }
            }

            var obj2 = {
                name: 'obj2',
                foo: () => {
                    console.log(this.name)//'window'
                }
            }
            obj1.foo()
            obj2.foo()
        </script>
    </body>

------------------------------
答案:obj1   window
    <body>
        <script>
            //EC(g)   go:name='window' ,obj1---0x001{name: 'obj1',foo:...},obj2 --0x002 {name: 'obj2',foo:...}
            //        vo:
            var name = 'window'
            var obj1 = {
                name: 'obj1',
                foo: function () {
                    //EC(foo)---0x003
                    //<EC(g),EC(foo)>
                    //this---obj1
                    console.log(this.name)//'obj1'
                }
            }

            var obj2 = {
                name: 'obj2',
                foo: () => {
                    //EC(foo)---0x004
                    //<EC(g),EC(foo)>
                    //this---obj1有因为是箭头函数,this重定向为上级作用域
                    console.log(this.name)//'window'
                }
            }

            obj1.foo()//this---obj1
            obj2.foo()//this---obj2
        </script>
    </body>

练习12:

var name = 'window'
var obj1 = {
  name: 'obj1',
  foo: function () {
    console.log(this.name)
    return function () {
      console.log(this.name)
    }
  }
}
var obj2 = {
  name: 'obj2',
  foo: function () {
    console.log(this.name)
    return () => {
      console.log(this.name)
    }
  }
}
var obj3 = {
  name: 'obj3',
  foo: () => {
    console.log(this.name)
    return function () {
      console.log(this.name)
    }
  }
}
var obj4 = {
  name: 'obj4',
  foo: () => {
    console.log(this.name)
    return () => {
      console.log(this.name)
    }
  }
}

obj1.foo()()
obj2.foo()()
obj3.foo()()
obj4.foo()()


-----------------------------------------
答案:
obj1.foo()() // 'obj1' 'window'
obj2.foo()() // 'obj2' 'obj2'
obj3.foo()() // 'window' 'window'
obj4.foo()() // 'window' 'window'

    <body>
        <script>
            //EC(g)   go:name='window' , obj1---0x001, obj2 --0x002 
            //           obj3---0x003, obj4 --0x004
            //        vo:
            var name = 'window'
            var obj1 = {
                name: 'obj1',
                foo: function () {
                    //EC(foo)---0x005
                    //<EC(g),EC(foo)>
                    //this---obj1
                    console.log(this.name)//'obj1'
                    return function () {
                        //EC()---0x006
                        //<EC(g),EC()>
                        //this---window
                        console.log(this.name)//'window'
                    }
                }
            }
            var obj2 = {
                name: 'obj2',
                foo: function () {
                    //EC(foo)---0x007
                    //<EC(g),EC(foo)>
                    //this---obj2
                    console.log(this.name)//'obj2'
                    return () => {
                        //EC()---0x008
                        //<EC(g),EC(foo)>
                        //this---obj1有因为是箭头函数,this重定向为上级作用域也是'obj2'
                        console.log(this.name)//'obj2'
                    }
                }
            }
            var obj3 = {
                name: 'obj3',
                foo: () => {
                    //EC(foo)---0x009
                    //<EC(g),EC(foo)>
                    //this---obj3有因为是箭头函数,this重定向为上级作用域也是window
                    console.log(this.name)//'window'
                    return function () {
                        //EC(foo)---0x010
                        //<EC(g),EC()>
                        //this---window
                        console.log(this.name)//'window'
                    }
                }
            }
            var obj4 = {
                name: 'obj4',
                foo: () => {
                    //EC(foo)---0x009
                    //<EC(g),EC(foo)>
                    //this---obj4有因为是箭头函数,this重定向为上级作用域'window'
                    console.log(this.name)//'window'
                    return () => {
                        //EC()---0x011
                        //<EC(g),EC(foo)>
                        //this---obj4有因为是箭头函数,this重定向为上级作用域'window'
                        console.log(this.name)//'window'
                    }
                }
            }

            obj1.foo()();//this---obj1,EC()---0x006()   'obj1' window
            obj2.foo()();//this---obj2,EC()---0x008()   'obj2' 'obj2'
            obj3.foo()();//this---obj3,EC(foo)---0x010()'window'  window
            obj4.foo()();//this---obj4,EC()---0x011()   'window''window'
        </script>
    </body>

练习13:

<body>
    <script>
        let x = 3,
        obj = {
            x: 5
        };
        obj.fn = (function () {
            this.x *= ++x;
            return function (y) {
                this.x *= (++x) + y;
                console.log(x);
            }
        })();

        let fn = obj.fn;
        obj.fn(6);
        fn(4);
        console.log(obj.x, x, window.x);
    </script>
</body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全新的大语言模型Grok-2,最新测评!!

埃隆马斯克再次引发轰动&#xff0c;他旗下的xAI公司推出了全新的大语言模型Grok-2&#xff01; 最新的Grok-2测试版已经发布&#xff0c;用户可以在&#x1d54f;平台上体验小版本的Grok-2 mini。 马斯克还通过一种谜语般的方式揭开了困扰大模型社区一个多月的谜团&#xff1a…

C/C++ 包管理器 Conan 安装及使用

文章目录 Github官网文档简介安装 Conan 包管理器Conan 私有存储库创建 profile 文件添加远程存储库依赖包操作命令 Artifactory 私有存储库下载安装包&#xff08;推荐&#xff09;Docker 方式安装 Conan 官方示例 Github https://github.com/conan-io/conan 官网 https://…

零代码上手,工厂数据管理从未如此简单

在当今快节奏的工业环境中&#xff0c;工厂管理者们越来越依赖于数据分析来优化生产流程、提高效率和降低成本。然而&#xff0c;传统的数据分析工具往往复杂难用&#xff0c;且动辄需要高昂的费用&#xff0c;这让很多工厂望而却步。不过最近本人发现了一款非常实用的报表工具…

智能废弃瓶子垃圾箱:城市环境的绿色守护者

随着城市化进程的加速&#xff0c;生活垃圾的处理成为城市管理中的一大挑战。智能废弃瓶子垃圾箱的出现&#xff0c;不仅提高了垃圾回收的效率&#xff0c;还促进了资源的循环利用&#xff0c;成为智慧城市建设的重要组成部分。 目录 技术概述 核心功能 应用场景 环境与社会…

Java数据结构栏目总结

目录 数组与稀疏数组 队列&#xff1a;自己用数组模拟Queue 环形队列&#xff0c;取模【取余】实现. 单链表(LinkList) 双向链表&#xff08;Next 、Pre&#xff09; 单向环形链表 线性结构 数组与稀疏数组 稀疏数组&#xff0c;很多0值&#xff0c;可用于压缩 特点&a…

在 AMD GPUs 上进行图分析使用 Gunrock

Graph analytics on AMD GPUs using Gunrock — ROCm Blogs 图和图分析是可以帮助我们理解复杂数据和关系的相关概念。在这种背景下&#xff0c;图是一种数学模型&#xff0c;用于表示实体&#xff08;称为节点或顶点&#xff09;及其连接&#xff08;称为边或链接&#xff09;…

【CTF Web】BUUCTF BUU BRUTE 1 Writeup(弱口令+暴力破解+字典攻击)

BUU BRUTE 1 1 点击启动靶机。 解法 随便输个用户名。 试试 admin。 用 burp 抓包。 生成四位数字的字典。 导入字典到 burp。 添加载荷位置。 开始爆破。破解完成&#xff0c;密码&#xff1a;6490。取得 flag。 注意 如果破解得慢的话&#xff0c;记得要续期靶机。不然靶机…

算法工程师秋招面试问题总结

大模型分布式训练并行 一般有 tensor parallelism、pipeline parallelism、data parallelism 几种并行方式,分别在模型的层内、模型的层间、训练数据三个维度上对 GPU 进行划分。三个并行度乘起来,就是这个训练任务总的 GPU 数量。 1.数据并行 数据并行是最常见的并行形式…

2024.8.27 作业

1> 提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream>using namespace std;int main() {string s;cout << "请输入字符串>>>";getline(cin,s);int letter0,digit0,blank0,…

git 复制提交到另外分支上

查看提交id 在原分支上查看要复制的id git log切换目标分支 将刚才复制的id&#xff0c;在这个目标分支上执行复制命令 git cherry-pick <commit-id>其中是要复制的提交的提交ID 效果 新分支上未复制的提交&#xff1a; 新分支上已复制的提交&#xff1a;

PTA - C语言国庆题集2

目录 7-21 打妖怪7-22 统计连续高温的最大天数7-23 唱歌比赛打分7-24 找最长的字符串7-25 算龙脉7-26 DNA鉴定7-28 T9键盘7-31 单链表的创建&#xff0c;遍历与销毁7-36 有多少位是7&#xff1f;7-37 选择排序7-38 翻转单词顺序7-39 求因子和最大的数&#xff08;结构体排序&am…

min(n,k)*min(m,k)

今天看那场一题都没写出来的div12&#xff0c;发现我想了那么久的A题&#xff0c;别人用几行代码就搞出来了。。。&#xff0c;现在感觉这道题和状压dp好像。。。 这道题用到了切比雪夫距离。。。

2024114读书笔记|《漱玉词》—— 绛绡缕薄冰肌莹,雪腻酥香,满院东风,海棠铺绣,梨花飞雪

2024114读书笔记|《漱玉词》—— 绛绡缕薄冰肌莹&#xff0c;雪腻酥香&#xff0c;满院东风&#xff0c;海棠铺绣&#xff0c;梨花飞雪 《漱玉词》李清照&#xff0c;观之入微&#xff0c;是惆怅亦是欢乐&#xff0c;不费力就可以读完的小诗词&#xff0c;插图不错。 知否的主…

Spring理论知识(Ⅱ)——Spring核心容器模块

Spring的组成 Spring由20个核心依赖组成&#xff0c;这20个核心依赖可以分为6个核心模块 本篇文章着重描述Spring核心容器模块&#xff0c;其中包含了spring-beans&#xff0c;spring-core&#xff0c;spring-context&#xff0c;spring-expression-language&#xff08;…

摄像头设备问题如何检测

摄像头等智能设备的在线状态通常被视为其运作正常的表现。但在日常监控使用中&#xff0c;由于使用空间、网络环境、产品年限等原因&#xff0c;设备掉线、视频流无法正常获取、监控画面异常&#xff08;如花屏&#xff09;&#xff0c;以及存储介质&#xff08;如SD卡&#xf…

【Electron】Electron学习笔记

1.什么是 Electron&#xff1f; Electron 是一个跨平台桌面应用开发框架&#xff0c;开发者可以利用 HTML、CSS、JavaScript 等Web技术来构建桌面应用程序。它本质上是结合了 Chromium 和 Node.js&#xff0c;目前广泛用于桌面应用程序开发。例如&#xff0c;许多桌面应用都采…

算法学习-基础算法

基础算法 一.二分查找 1.模版 boolean check(int x) { }int search(int left, int right) {while (left < right) {int mid (left right) >> 1;if (check(mid)) {//满足条件&#xff0c;向寻找范围继续寻找&#xff0c;例如我要找更靠左的&#xff1a;r m right…

一次学校OJ 代码执行测试

前言 以前看过一篇Windows上搭OJ被C#打穿的文章&#xff0c;刚好测测学校的OJ。 这里没有过多的研究其余的可能利用点&#xff0c;仅仅是简单记录下过程&#xff0c;一些思路的启发。 测试过程 首先看支持的代码类型&#xff1a; 尝试了Java发现不能import&#xff0c;那J…

一文带你从零到实战,学会gcc和Makefile,多文件编译神器的使用与编写

目录&#xff1a; 目录&#xff1a; 一、什么是Makefile 1.1 makefile的作用&#xff1a; 1.2 makefile的基本组成&#xff1a; 二、Linux编译过程&#xff1a; 2.1 linux编译过程: 2.1.1 预处理&#xff08;Preprocessing&#xff09; 2.1.2 编译&#xff08;Compilation&am…

# 移动硬盘误操作制作为启动盘数据恢复问题

移动硬盘误操作制作为启动盘数据恢复问题 文章目录 移动硬盘误操作制作为启动盘数据恢复问题步骤一恢复原有数据 步骤二格式化并重新分区 注意注意先找数据恢复软件恢复数据&#xff0c;把之前移动硬盘或者U盘上的数据恢复到其它地址 步骤一 恢复原有数据 使用一些数据恢复软…