在利用JavaScript开发的时候,经常遇见因为this引发的问题,很容易给我们程序员高兴死,所以我要记录一篇有关this的文章,好让朕遇见的时候不至于高兴死。
我们先了解一下this的使用场景呗...
我们直接使用this看看会返回个啥。
- 浏览器环境下
this //返回Window
this === window //返回true
浏览器环境之中this就是代表当前的全局对象Window
- Node命令行环境
this //返回global
this === global //返回true
Node环境之中this代表当前的全局对象global,利用Node运行js脚本文件时this代表的是空对象
根据我的理解,不论这个this出现在什么场合,他都总是返回一个对象
写个简单的例子,这谁都会
function f() {
return '姓名:'+ this.name;
}
var A = {
name: '张三',
describe: f
};
var B = {
name: '李四',
describe: f
};
A.describe() // "姓名:张三"
B.describe() // "姓名:李四"
很好发现,这是哪个实例调用的,那个this就是那个实例。
我们现在再直接调用f()函数,函数内部会去找全局对象中挂载的name属性,如果没有就返回undefined.
接着我们测试个好玩的,在回调函数内测试这个this。
let obj = {};
obj.f = function(){
console.log(this === obj);
}
document.querySelector("h1").addEventListener("click",obj.f)
这样乍一看,调用函数的是obj
对象,这个函数应该返回的是个true,但是我们点击发现,他返回的是false。原因是现在的this指向的并不是obj
对象了,而是页面上的Dom对象。
我的解决办法是,如下
let obj = {};
obj.f = function(){
console.log(this === obj);
}
let myfunc = obj.f.bind(obj)
document.querySelector("h1").addEventListener("click",myfunc)
这样返回的就是true了,代码中用到了bind()函数了,这个以后再介绍吧。
大意就是给这个f函数绑定this对象就是obj...
其他我想嗦的东西
刚才我们测试来着,如果直接调用函数体内打印this的函数,他会返回全局对象,global
Window
,但是当我们给我们的js代码设置为严格模式'use strict'
后,这个this就是undefined,如果函数内是如this.啥啥啥的就会报错的
以及箭头函数没有this
网友评论