我对JavaScript中this的一些理解

栏目: JavaScript · 发布时间: 5年前

内容简介:因为日常工作中经常使用到这段时间翻阅了一些书籍也查阅了网上一些资料然后结合自己的经验,为了能让自己更好的理解

因为日常工作中经常使用到 this ,而且在JavaScript中 this 的指向问题也很容易让人混淆一部分知识。

这段时间翻阅了一些书籍也查阅了网上一些资料然后结合自己的经验,为了能让自己更好的理解 this ,进而总结一篇文章。

this 是什么

this 是 JavaScript 语言的一个关键字。它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。

实际是在函数被调用时才发生的绑定,也就是说 this 具体指向什么,取决于你是怎么调用的函数。

this 指向的四种情况

这四种情况基本涵盖了JavaScript中常见的 this 指向问题

1. 全局的函数调用,this指向window

var a = 1;
function fn() {
   console.log(this.a);
}
fn();  // 1

这种 情况下的 this 其实就是 window 对象,这个很好理解。

但是还有一种情况,就是匿名函数的 this 也会指向 window

var a= 'window';
var obj={a: 'object'}
obj.fn=function(){
    console.log(this.a);//Object
    +function(){
        console.log(this.a)//window
    }()
}
obj.fn()

匿名函数的执行环境具有全局性,因此它的 this 对象通常指向windows。

如果对此有疑惑,可以看知乎上的答案: 知乎 - 匿名函数的this指向为什么是window?

2. 作为对象方法的调用,this指向该对象

var a ='window'
var obj={
  a: 'object',
  fn: function(){
    console.log(this.a);
  }
}

obj.fn(); // object

当函数作为某个对象的方法调用时, this 就指这个函数所在的对象。

3. 作为构造函数调用,this指向实例

function fn() {
 this.x = 1;
}
var obj = new fn();
console.log(obj.x) // 1

构造函数中的 this ,在通过 new 之后会生成一个新对象,this就指这个新对象。

new 有疑问的话,可以看 冴羽的博客 JavaScript深入之new的模拟实现

4. 使用call/apply/bind调用, this指向第一个参数

var obj1={
  a: 'boj1'
}
var obj2={
  a: 'obj2'
}
var obj3={
  a: 'obj3'
}
function fn(){
  console.log(this.a);
}
// apply
fn.apply(obj1);// 'obj1'
// call
fn.call(obj2);// 'obj2'
// bind
var fnBind= fn.bind(obj3);
fnBind();// 'obj3'

call/ apply / bind 都有一个共同的特点,就是改变 this 的指向,使用这种方法可以把别人的方法拿过来用到自己身上。

第一个参数为 null 的时候,视为指向 window .

var a='window'
var obj={
  a: 'boj',
  fn: function (){
    console.log(this.a);
  }
}
obj.fn.call(null);// 'window'

在这里如果是 obj.fn() 调用的 fn() 方法, this 应该指向 obj 没错。

但是因为 call(null) 的存在,改变了指向,所以 this 指向了 window

深入理解

正因为比较难理解,所以 this 指向也是面试时最容易遇到的问题,比如下面这道我曾遇到的一个面试题:

var length = 10;
function fn(){
  console.log(this.length);
}
var obj = {
  length: 5,
  method: function(fn){
    fn();
    arguments[0]();
  }
};
obj.method(fn, 1);

在这道题里,不仅考察了对 this 熟悉程度,还考察了函数的传参形式、作用域、以及 arguments 这种特殊的数组的理解。

只有真正理解了这些才能正确的判断 this 究竟指向了谁。

所以,只有对 JavaScript 中的各项知识点深入理解,才会对 this 的概念越加清晰。

文章仅日常学习工作所得,欢迎大家访问我的 blog


以上所述就是小编给大家介绍的《我对JavaScript中this的一些理解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java编程思想

Java编程思想

[美] Bruce Eckel / 陈昊鹏、饶若楠 / 机械工业出版社 / 2005-9 / 95.00元

本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性(深入的面向对象概念、多线程、自动项目构建、单元测试和调试等),本书都能逐步指导你轻松掌握。 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作。本书的作者拥有多年教学经验,对C、C++以及Java语言都有独到......一起来看看 《Java编程思想》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

在线进制转换器
在线进制转换器

各进制数互转换器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具