美文网首页前端技术
JavaScript 中的 this

JavaScript 中的 this

作者: 一俢 | 来源:发表于2019-01-26 09:30 被阅读40次

在很多面向对象的语言中(Java、C#),this 关键字的含义非常明确,就是代表当前对象,通常在编译期间就确定下来(编译期绑定);而在 JavaScript 中,this 是动态绑定的,这样导致 this 非常灵活多变,给我们带来非常多的不便。

外部函数调用

外部函数中调用this时,它将指向全局对象,浏览器中即为 window:

function whatIsThis() {
    console.log(this);
}
whatIsThis();

会打印出Window对象

内部函数调用

内部函数中调用this时,它和外部函数调用一样,指向了全局对象:

var obj = {
    a: 0,
    fn: function(){
        var whatIsThis = function(){
            console.log(this);
        }
        
        whatIsThis();
    }
};
obj.fn();

会打印出Window对象

对象的方法调用

对象的方法中调用this时,它将指向这个对象:

var obj = {
    a: 0,
    whatIsThis: function(){
        console.log(this);
    }
};
obj.whatIsThis();

会打印出当前Object对象

构造函数内部调用

构造函数的对象调用this时,它将指向这个对象:

function Class() {
    console.log(this);
}
var obj = new Class();

使用 call 和 apply 调用

箭头函数中的 this

在 ES6 语法中 ()=>this 箭头函数中的 this 就很特殊了,箭头函数没有一个自己的 this,但当你在内部使用了 this,常规的局部作用域准则就起作用了,它会指向最近一层作用域内的 this

var obj = {
    a: 0,
    whatIsThis: function() {
        console.log(this);
        
        var fn = () => console.log(this);
        
    }
};
obj.whatIsThis();

两个都会打印出当前Object对象

总结

上面所说的可能很晕,记住这一点:用对象调用的方法中使用的this会指向该对象;直接调用的函数中使用的this会指向全局对象。

this 是否可以被完全修改(或者把一个对象全部赋值给它)?

昨天面试的时候,突然有一个自称初学者的应聘同学问了一个问题,this是否能给它赋上另外一个对象呢?我当时就傻了,在实际操作中很少去做这件事情,将方法内部的this增加一个属性倒是没有太大问题,如果试图全部修改它,这种事情恐怕很少做这种操作。当然我当时的回答是:“好像有点矛盾,很可能 this 本身是有一些属性是只读的”。

于是我回来做了一个实验,将各种情况的 this 都赋上另外一个对象,结果是:Uncaught ReferenceError: Invalid left-hand side in assignment 。看起来的确是不行的,细想一下也是能够理解的:

  • 如果自己能够将自己变成一个其它的对象,但是另外那个对象又没有修改自己的能力,这岂不是自相矛盾;
  • 如果另外一个对象的确能修改自己,这样一来岂不是进入了无限被修改的循环中。

相关文章

  • 1body中添加js

    1 中的 JavaScript JavaScript 函数和事件上面例子中的 JavaScript 语句,会...

  • JS中的类型转换

    JavaScript 中的类型转换 JavaScript 基本数据类型 JavaScript 中的一共有 8 中内...

  • js中的this

    javascript中的this javascript中的this与java中的this有点不同。ECMAScri...

  • JavaScript中的字符串

    @(javascript)[js字符串][toc] JavaScript中的字符串 字符串是JavaScript中...

  • 06-JavaScript数组和函数

    JavaScript数组 JavaScript中的数组可以存储不同类型的数据 JavaScript中的数组是引用类...

  • Client's JavaScript

    什么是JavaScript? JavaScript的运行环境? 浏览器中JavaScript可以做什么? 浏览器中...

  • javascript中的this

    一般说到JS的this,都会想起在函数中变来变去的this。但是事情的发生都是有规则的约束,JS中的this也不例...

  • JavaScript中的this

    什么是this? 首先对this的下个定义:this是在执行上下文创建时确定的一个在执行过程中不可更改的变量。th...

  • JavaScript中的this

    JavaScript中的this很容易让人迷惑,但弄清楚后其实还是很好区分的。JavaScript中的this总是...

  • javascript中的this

    在javascript中的this大致可以理解成谁调用的this就指向谁 全局环境中的this 函数中的this ...

网友评论

    本文标题:JavaScript 中的 this

    本文链接:https://www.haomeiwen.com/subject/eggbjqtx.html