this指向:

JS中的this指向_js this_Armin444的博客-CSDN博客

严格模式和非严格模式区别_weixin_33797791的博客-CSDN博客 

目录

概念:

不同情景下的this指向:

一、全局环境下的this:

二、函数里的this:

1、普通函数:

2、箭头函数:

3、构造函数:

三、对象里里里的this:最外层对象本身的指向是window

四、原型链的this:

改变this指向的方法:


先上一道面试题:

  var x = 1;
  var obj = {
        x: 3,
        fun: function () {
            var x = 5;
            return this.x;

        }
    }
   var fun = obj.fun;
   console.log(obj.fun(), fun());

//打印结果:3 1

概念:

        1、this是一个指针型变量,它动态指向当前函数的运行环境。

        2、在不同的场景中调用同一个函数,this的指向也可能会发生变化,但是它永远指向其所在函数的真实调用者;如果没有调用者,就指向全局对象window。

        普通函数:关于this,谁调用就指向谁;没有调用者,就指向全局对象window。

        箭头函数:箭头函数的this指向于函数作用域所用的对象。

不同情景下的this指向:

一、全局环境下的this:

        在全局作用域下,this始终指向全局对象window,无论是否是严格模式!

二、函数里的this:

1、普通函数:

a.严格模式:

        在严格模式下, 我们对代码的的调用必须严格的写出被调用的函数的对象,不可以有省略或者说简写。

  function test() {
            'use strict'
            console.log(this)
        }
  test();
  window.test();
//打印结果: undefined  window

b.非严格模式:

  function test() {        
            console.log(this)
        }
  test();
  window.test();
//打印结果: window window

2、箭头函数:

        箭头函数的重要特征:箭头函数中没有this和arguments,是真的没有!

        箭头函数没有自己的this指向,它会捕获自己定义所处的外层执行环境,并且继承这个this值,指向当前定义时所在的对象。箭头函数的this指向在被定义的时候就确定了,之后永远都不会改变。即使使用call()、apply()、bind()等方法改变this指向也不可以。

        如果父级作用域还是箭头函数,就再往上找,一层一层的直到直到this的指向。

 var y = 9;

 var show = () => {
            var y = 8;
            console.log(this.y)
        };

 var obj = {

            y: 88,
            num: this.y,
            watch: () => {
                console.log(this.y)
            }
        };

  show();
  window.show();
  obj.watch();
  window.obj.watch();
  console.log(obj.num);

//打印结果: 9 9 9 9 9
//由于show函数是箭头函数,所以自身不能绑定this,因此找它的上一级作用域。

//window.show()返回值是window,所以this此时指向window;

//window.obj.show(),obj是对象,非箭头函数,所以找到这里就停止了,
//this绑定到obj上。window调用obj,所以obj中的this也指向window。

3、构造函数:

        构造函数中的this指向构造函数下创建的实例

       var obj = {
            name: 'yuan',
            address: 'chengdu'
        }

        function Cat(name, address) {
            this.name = name;
            this.address = address;
        }

        var SongGuo = new Cat('song', 'beijing');
        console.log(SongGuo.name);
        console.log(SongGuo.address);
    //打印结果:  song beijing

三、对象里里里的this:最外层对象本身的指向是window

        对象内部方法的this指向调用这些方法的对象,也就是谁调用就指向谁

1、一层对象和两层对象一起比较:

  var x = 1;
  var obj = {
            x: 3,
            fun: function () {
                var x = 5;
                console.log(this.x);

            },
            obj2: {
                x: 33,
                fun2: function () {
                    var x = 55;
                    console.log(this.x);
                }
            }
        }

   obj.fun();
   obj.obj2.fun2();
//打印结果:3  33 

总结:

        a、函数的定义位置不影响其this指向,this指向只和调用函数的对象有关

        b、多层嵌套的对象,内部方法的this指向离被调用函数最近的对象

四、原型链的this:

        this这个值在一个继承机制中,仍然是指向它原本属于的对象,而不是从原型链上找到它时,它所属于的对象。

改变this指向的方法:

        call()、apply()、bind()等;

见:JS中的this指向_js this_Armin444的博客-CSDN博客

你可能感兴趣的:(前端,javascript,jquery)