javascript中的this使用场景以及箭头函数中的this

刚接触js不久时对this总是感到无比迷茫,以下是来自js设计模式与实践里的总结

this总是指向一个对象,有时指向全局对象,有时指向构造对象,有时指向DOM对象

1. 作为对象的方法调用

做为对象的方法调用时 this 指向对象本生

var Person = {
    name: 'bingxl',
    getName: function () {
        console.log(this.name);  //bingxl
    }
};
Person.getName();

2. 作为普通函数被调用

普通函数里的this总是指向全局变量

var name = 'window';
function getName() {
    var name = 'function';
    return this.name;
}

console.log( getName()); //window  严格模式下为undefined

对象的方法复制给变量,在通过变量来调用后对象的方法变成了普通函数

var name = 'window';
var Person = {
    name: 'bingxl',
    getName: function () {
        return this.name;
    }
};
var getName1 = Person.getName;
console.log(getName1());  // window
var getName2 = Person.getName();
console.log(getName2);    // bingxl

观看这个例子发现:
getName1 = Person.getName 是把getName1指向Person.getName方法的内存地址(方法本身没有被执行),其本质是个函数,所以在使用getName1() 时就是调用普通函数
getName2 = Person.getName() 是把Person.getName的返回值(已经执行了)bingxl赋值给getName2
对两个变量经行typeof操作

console.log(typeof getName1);  //function
console.log(typeof getName2);// string

3. DOM事件触发函数里的this

DOM事件触发函数里的this指向DOM节点本身

<!DOCHTML html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
   <div id='person'>click this</div>
    <script>
        window.id = 'window';
        var div = document.getElementById('person');
        div.addEventListener('click', function () {
            console.log(this.id); //person
            var test = function () {
                console.log(this.id); // window
            };
            test();
        });
    </script>
</body>
</html>

test() 是一个普通函数,所以test里的this指向了全局对象window

4. 构造器调用

使用new运算符调用构造函数时会返回一个对象,构造函数里的this一般就指向返回的对象
当构造函数使用return显式的返回一个对象时new操作符返回的就是显式返回的对象

var Person = function () {
    this.name = 'bingxl';
};
var student = new Person();
console.log(student.name); // bingxl
var Person = function () {
    this.name = 'bingxl';
    return {
        name: 'test'
    };
};
var student = new Person();
console.log(student.name); // test

5. call , apply 和 bind

通过call 或apply调用会改变this的指向传入的对象


var Doctor = {
    name: 'bingxl',
    profession: 'doctor',
    getProfession: function () {
        console.log(this.profession);
    }
};

var Student = {
    name: 'zhangsan',
    profession: 'student'
};
Doctor.getProfession(); // doctor
Doctor.getProfession.call(Student); //student

6. 箭头函数中的this

箭头函数中的this就是定义时所在的this, 也就是说 箭头函数本身没有this。
箭头函数也可以使用bind, call , applay来改变this指向

var env = 'window'
function Test() {
    this.env = 'test function';
    console.log('in Test Object', this.env); // test function
    let arrow = () => {
          console.log('in arrow function',  this.env); // test function
    };
   arrow();
    sub();
    function sub( ) {
        console.log('in sub ', this.env); // window, 普通函数中的this指向全局变量
    }
}

const test = new Test();

对比 arrow 和 sub 函数可以看出


end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,363评论 18 399
  • 1.扉页 1.1 本话扉页是应读者要求,弗兰奇给螃蟹装上了钢铁之躯,弗兰奇的字母BF是英文Battle Frank...
    顽皮仕阅读 3,437评论 0 0
  • 本人第一次在简书写文章,文笔实在太差,可能写得不好并且主题不明确,还请大家理解! 有人说一个人的成功是由能力决定,...
    印记丶阅读 4,404评论 0 2
  • 我买回了一只蝈蝈儿。 是从一个脸色黑红的中年农民手里买的,他挑着一旦蝈蝈,每只蝈蝈都装在编的笼子里面,他挑着担子在...
    灵感先生gary阅读 4,731评论 0 0

友情链接更多精彩内容