美文网首页
JavaScript中的this

JavaScript中的this

作者: LHH大翰仔仔 | 来源:发表于2019-01-21 10:00 被阅读95次

JS JavaScript中的this

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

function test() {
 this.x = 1;
}

那么,this的值是什么呢?
函数在不同使用场合,this有不同的值。总之,this就是函数运行时所在的环境对象。

情况一:纯粹的函数调用

这是函数的最常通用法,属于全局性调用,因此this就代表全局对象。

var x = 1;
function test() {
   console.log(this.x);
}
test();  // 1
情况二:作为对象的方法调用

函数还可以作为某个对象的方法调用,这时this就指这个上级对象

function test() {
  console.log(this.x);
}

var obj = {};
obj.x = 1;
obj.m = test;

obj.m(); // 1
情况三:作为构造函数调用

构造函数就是通过这个函数可以生成一个新对象。这时,this就指这个新对象

function test() {
 this.x = 1;
}

var obj = new test();
obj.x // 1

为了表明这时this不是全局对象,下面代码:

var x = 2;
function test() {
  this.x = 1;
}

var obj = new test();
x  // 2

运行结果为2,表明全局变量x的值没有变化

情况四:apply调用

apply()是函数的一个方法,作用是改变函数的调用对象。它的第一个参数就表示改变后的调用这个函数的对象。因此,这时this指的就是这个参数。

var x = 0;
function test() {
 console.log(this.x);
}

var obj = {};
obj.x = 1;
obj.m = test;
obj.m.apply() // 0

apply()的参数为空时,默认调用全局变量。因此,这时运行结果为0,证明this指的是全局对象。
如果把最后一行代码修改成

obj.m.apply(obj); //1

运行结果就变成1,证明这时this代表的对象是obj

改变this的指向有以下几种方法

  • 使用ES6的箭头函数
  • 在函数内部_this=this
  • 使用applycallbind
  • new实例化一个对象

其实this的指向,始终坚持一个原理:this永远指向最后调用它的那个对象。

例1:
var name = "windowsName";
function a() {
   var name = "Cherry";

   console.log(this.name);          // windowsName

   console.log("inner:" + this);    // inner: Window
}
 a();
 console.log("outer:" + this)         // outer: Window

这里我们使用严格模式,如果使用严格模式的话,全局对象就是 undefined,那么就会报错 Uncaught TypeError: Cannot read property 'name' of undefined

例2:
    var name = "windowsName";
    var a = {
        name: "Cherry",
        fn : function () {
            console.log(this.name);      // Cherry
        }
    }
    a.fn();
例3:
var name = "windowsName";
var a = {
    name: "Cherry",
    fn : function () {
        console.log(this.name);      // Cherry
     }
  }
window.a.fn();
例4:
    var name = "windowsName";
    var a = {
        // name: "Cherry",
        fn : function () {
            console.log(this.name);      // undefined
        }
    }
    window.a.fn();
例5:
    var name = "windowsName";
    var a = {
        name : null,
        // name: "Cherry",
        fn : function () {
            console.log(this.name);      // windowsName
        }
    }

    var f = a.fn;
    f();

为什么不是 Cherry,这是因为虽然将a 对象的 fn方法赋值给变量 f 了,“this永远指向最后调用它的那个对象”,由于刚刚的f 并没有调用,所以 fn() 最后仍然是被 window 调用的。所以 this 指向的也就是 window

例6:

    var name = "windowsName";

    function fn() {
        var name = 'Cherry';
        innerFunction();
        function innerFunction() {
            console.log(this.name);      // windowsName
        }
    }

    fn()
欢迎关注

相关文章

  • 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/yybqjqtx.html