javascript中this的理解

作者: laohan | 来源:发表于2016-06-27 22:33 被阅读136次

this在javascript中一直是新手难以理解的一部分。其实并不难,只要清楚几种调用模式,就容易掌握了。

函数调用模式

普通情况

var  name = 'outer';
var fn = function() {
    var name = 'inner';
    console.log(this.name);
}
fn(); // outer

回调函数

无默认绑定

var name = 'outer';
var A = function() {
    console.log(this.name);
};
var B = function(cb) {
    var name = 'inner';
    cb();
}
B(A); // outer

默认绑定

js中的事件机制,会默认绑定this

var name = 'outer';
var d = document.querySelector('div');
div.addEventListener('click', function(e) {
    console.log(this.name); // undifined
}, false)

方法调用模式

var name = 'outer;
var obj = {
    name: 'inner',
    fn: function() {
        console.log(this.name);
    }
}
obj.fn()  // inner

apply、call调用模式

var name = 'outer';
var obj = {
    name: 'inner'
}
var fn = function() {
    console.log(this.name);
}
fn() //  outer;
fn.call(obj) // inner
fn.apply(obj) // inner

构造器调用模式

var name = 'outer';
var Fn = function(name) {
    this.name = name;
}
Fn.prototype.print = function() {
    console.log(this.name)
}
var obj = new Fn('inner');
obj.print() // inner

bind, call优先级

var name = 'outer';
var obj1 = {
    name: 'inner1'
};
var obj2 = {
    name: 'inner2';
};
var fn = function() {
    console.log(this.name);
}
var f = fn.bind(obj1);
f();  // inner1
f.call(obj2)  // inner1

可以看出,bind的优先级是比call要高的,当函数fn的this绑定为obj1后,再执行f.call(obj2),输出的name值还是name1,即this的值一直绑定为obj1。

es6的箭头函数

箭头函数的好处之一就是让我们省去了每次敲打function这个关键词,好处之二就是this值默认绑定为函数定义时的上下文,而跟调用模式无关。

var name = 'outer';
var obj = {
    name: 'inner',
    fn: ()=> {
        console.log(this.name);
    }
}
obj.fn() // outer
var name = 'outer';
var obj = {
    name: 'inner'
};
var fn = ()=> {
    console.log(this.name);
};
fn.call(obj)  // outer
var name = 'outer';
var obj = {
    name: 'inner'
};
var fn = ()=> {
    console.log(this.name);
};
var f = fn.bind(obj);
f() // outer

相关文章

  • javascript中this的理解

    早期的博客2this是javascript的一个关键字,代表函数运行时,自动生成的一个内部对象,只能在函数内部使用...

  • 理解JavaScript中的this

    前言 做为一个初学者,原型与闭包可以说是 JavaScirpt 中理解起来最难的部分了,当然,目前了解的也只是了解...

  • 理解JavaScript中的this

    理解this JavaScript中的this是其灵活性的表现,同时也因为this的多变性与其他语言的不一致,也成...

  • 理解Javascript中的this

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁...

  • javascript中this的理解

    this在javascript中一直是新手难以理解的一部分。其实并不难,只要清楚几种调用模式,就容易掌握了。 函数...

  • 理解Javascript中this

    在 学习JavaScript 的过程中,this 这个关键字常常困扰着初学者甚至一些进阶的开发者;尤其对一些学过面...

  • JavaScript中‘this’理解

    1. this之谜 在JavaScript中,this是当前执行函数的上下文。因为JavaScript有4种不同的...

  • 理解 JavaScript 中的内存管理(Memory Mana

    理解 JavaScript 中的内存管理(Memory Management) 平时写 JavaScript 代码...

  • 全面理解JavaScript中的this

    this在JavaScript中似乎可以视而不见,但不去正视它学到的就只是残缺的JS。抛开这些“形而上”的意义不说...

  • JavaScript中的prototype理解

    JS中的prototype理解

网友评论

    本文标题:javascript中this的理解

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