js | 改变this的指向

三种状况:bash

// 状况一
(obj.foo = obj.foo)() // window
// 状况二
(false || obj.foo)() // window
// 状况三
(1, obj.foo)() // window
复制代码

分析: obj.foo就是一个值。这个值真正调用的时候,运行环境已经不是obj了,而是全局环境,因此this再也不指向obj函数

简述: JavaScript 引擎内部,obj和obj.foo储存在两个内存地址,称为地址一和地址二。obj.foo()这样调用时,是从地址一调用地址二,所以地址二的运行环境是地址一,this指向obj。可是,上面三种状况,都是直接取出地址二进行调用,这样的话,运行环境就是全局环境,所以this指向全局环境ui

例子:this

// 状况一
(obj.foo = function () {
  console.log(this);
})()
// 等同于
(function () {
  console.log(this);
})()

// 状况二
(false || function () {
  console.log(this);
})()

// 状况三
(1, function () {
  console.log(this);
})()
复制代码

除此以外:spa

嵌套对象内部的方法赋值给一个变量,this依然会指向全局对象

var a = {
        b: {
            m: function () {
                console.log(this.p);
            },
            p: "hello"
        }
    };

    var hello = a.b.m;
    hello() //undefined
复制代码

.net

var a = {
        b: {
            m: function () {
                console.log(this.p);
            },
            p: "hello"
        }
    }
    var hello = a.b;
    hello.m(); //hello
复制代码

解析: 将其赋值给hello变量,结果调用时,this指向了顶层对象。为了不这个问题,能够只将m所在的对象赋值给hello,这样调用时,this的指向就不会变code

回顾:对象

使用箭头函数

var a = {
        b: {
            m: ()=> {
                console.log(this.p);
            },
            p: "hello"
        }
    }
    var hello = a.b;
    hello.m(); //undefined
复制代码

解析请看此时不能使用箭头函数blog

相关文章
相关标签/搜索