博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【js基础修炼之路】— 浅谈this关键字
阅读量:4677 次
发布时间:2019-06-09

本文共 2206 字,大约阅读时间需要 7 分钟。

在我学习this关键字的时候,通过查找资料总结出一些this的特殊用法,

供大家参考,代码里面有我总结的分析过程!

箭头函数里的this:

var username = "全局";    var obj = {        username: '张举欣',        say() {            setTimeout(function() {                console.log(this.username)                //这里的this指向的是定时器,进而指向window            })            setTimeout(() => {                //箭头函数里的this指的是宿主对象                         //没有宿主对象,默认是window                console.log(this.username);            })        }    }    obj.say()

易混淆的this

window.val = 1;    var obj = {        val: 2,        dbl: function() {            this.val *= 2; //4            val *= 2; //2            console.log(val); //2            console.log(this.val); //4        }    };    // 说出下面的输出结果    obj.dbl();    var func = obj.dbl;    func();

// 结果是: 2 4 8 8

/*val变量在没有指定对象前缀,默认从函数中找,找不到则从window中找全局变量

即 val *=2 就是 window.val *= 2

this.val默认指的是 obj.val ;因为 dbl()第一次被obj直接调用

<2>14行代码调用

func() 没有任何前缀,类似于全局函数,即 window.func调用,所以

第二次调用的时候, this指的是window, val指的是window.val

第二次的结果受第一次的影响*/

下面在来看一段代码

var obj = {        func: function() {            console.log('我是func');        },        say: function() {            // 此时的this就是obj对象              setTimeout(function() {                console.log(this);                this.func()                //使用bind绑定this指向obj            }.bind(this));        }    }    obj.say(); // obj

在这里,使用bind绑定this,改变指针的指向!

var obj = {        say: function() {            var f1 = () => {                console.log(this); // obj                setTimeout(() => {                    console.log(this); // obj                })            }            f1();        }    }    obj.say()
  //因为f1定义时所处的函数 中的 this是指的 obj, setTimeout中的箭头函数this继承自f1, 所以不管有多层嵌套,都是 obj 没有宿主对象的情况
var obj = {        say: function() {            var f1 = function() {                console.log(this); // window, f1调用时,没有宿主对象,默认是window                setTimeout(() => {                    console.log(this); // window                })            };            f1();        }    }    obj.say()

//结果: 都是 window,因为 箭头函数在定义的时候它所处的环境相当于是window, 所以在箭头函数内部的this函数window

 

最后注意

//使用箭头函数,可以让我们解决一些在匿名函数中 this指向不正确的问题; 但是要注意在和普通函数混合的时候,this的指向可能是window !

 

 

转载于:https://www.cnblogs.com/-yu-ze-/p/8521585.html

你可能感兴趣的文章
(7)如何得到所有的 "水仙花数" ?
查看>>
洛谷P3527 [POI2011]MET-Meteors [整体二分]
查看>>
Redis学习笔记11--Redis分布式
查看>>
NHibernate.3.0.Cookbook第一章第六节Handling versioning and concurrency的翻译
查看>>
pydev安装
查看>>
js中arr.sort的用法
查看>>
LoadRunner录制不弹出IE浏览器,event=0
查看>>
android N刷机
查看>>
第六周作业 :软件项目管理学习小结
查看>>
https的配置
查看>>
ASP.NET MVC Controller激活系统详解:总体设计
查看>>
【知识总结】Polya 定理
查看>>
CSS3那些常用的效果
查看>>
web.xml配置WebApplicationContext的两种方法
查看>>
redis过期机制(官网文档总结)
查看>>
WPF 大数据加载过程中的等待效果——圆圈转动
查看>>
ASP.NET Core 搭配 Nginx 的真实IP问题
查看>>
WPF下载远程文件,并显示进度条和百分比
查看>>
WPF设计の画刷(Brush)
查看>>
3.1依赖注入「深入浅出ASP.NET Core系列」
查看>>