this, call, apply 和 bind

栏目: JavaScript · 发布时间: 5年前

内容简介:这篇关于在永远指向最后调用它的对象。简单记忆:

这篇关于 this 的文章,仅仅是自己认为比较重要且易混淆的知识点。

内容

1.含义:

JavaScript 中, this 对象是指 当前函数 中正在执行的上下文环境,因此 this 并非是定义时(箭头函数除外)。

2. this 指向:

永远指向最后调用它的对象。简单记忆: A.B() 这里的 this 就指 . 左边的 A .

3. this 对象分类:

  • this 对象分类:
    • 全局对象
    • 当前对象
    • 任意对象

判断处于哪种this对象,这个取决于函数的调用方式。而JavaScript中的函数调用方式又分为四种:

  • JavaScript 中的函数调用方式:
    call 、apply 、bind
    

4. 具体内容:

4.1 函数调用

var a = 11;
function foo() {
    var a = 22;
    console.log(this.a);//11
}
foo();
console.log(this.a);//11
复制代码

函数调用:在 独立调用 中, this 在非严格模式下指向全局对象 window .在严格模式下 thisundefined 。在这里,用 var 声明一个变量和给 this 以及 window 添加属性是等价的。

var myname = "princess";
console.log(this.myname); //princess
console.log(window.myname); //princess
复制代码

接着可能会有下面的疑惑:

var foo = 123;//foo 是变量
window.bar = 345;//bar 是属性
delete foo;
delete bar;
console.log(this.foo,this.bar);//123,undefined  为什么不一样呢?
复制代码

delelte删除不了变量、删除不了原型链中的变量、可以删掉对象属性!

还得注意以下一点:

(…)(); 这样形式 (IIFE(立即调用的函数表达式)) 封装的函数会立即被调用,也就是说等同于被独立调用,因此它内部的 this 全局变量 ,所以输出的是全局变量。

4.2 作为对象的方法调用

var b = 33;
var o = {
    b: 44,
    f: function() {
        return this.b;
    }
};
console.log(o.f());//44
复制代码

作为对象的方法调用: this 指向该对象(这里即对象 o )。

但是当对象的方法被赋予给一个变量时,其相当于函数触发,此时的this为 window (非严格模式下)或者 undefined(严格模式下)。

var b = 33;
var o = {
    b: 44,
    f: function() {
        return this.b;
    }
};
console.log(o.f());//44
var c = o.f;    // this == window || undefined
c();//33
复制代码

4.3 构造函数调用

  • new 方法创建对象的时候,会经过如下过程:
    this
    this
    this
    

注意关键字 new

function Person(name, age) {
    this.name = name;
    this.age = age;
    return {
        name: 'Mary'
    };
}
var person1 = new Person('Jack');
console.log(person1.name);    // 'Mary'
console.log(person1.age);     // undefined
复制代码

而下面的情况:

function Person(name, age) {
    this.name = name;
    this.age = age;
    return this;
}

var person1 = Person('Bob', 18);
console.log(person1.name);    // Bob
console.log(window.name);     // Bob
console.log(person1 === window);    // true
复制代码

构造函数调用: this 指向该实例对象。

4.4 call 、apply 、bind

callapply 均可以改变 this 指向,差别在于传入参数的不同。

A.call(this,arg1,arg2...,argn)

A.apply(this,[arg1,arg2...,argn])

如果第一个参数为 null 或者 undefined ,那么就非严格模式下默认为此时的 thiswindow 对象,严格模式下为 undefined .而 bind 函数返回的是一个新的函数,即方法,不是立即执行函数,需要手动去调用 bind() .

使用 bind()方法创建的上下文,其为永久的上下文环境,不可修改,即使是使用 call 或者 apply方法,也无法修改 this 所指向的值。

5. 还有一种情况:

箭头函数:此时会从 包裹 它的函数或作用域中获取 this 的值。

箭头函数中的 this 定义 它的时候已经决定了,与如何调用以及在哪里调用它无关,包括 (call, apply, bind) 等操作都无法改变它的 this

var x=11;
var obj={
 x:22,
 y:this,
 say:()=>{
   console.log(this.x);
 }
}
obj.say();//11
console.log(obj.y);//window
复制代码

这里按照上述“定义”时决定 this 指向,应该输出 22 ,但是又可以看出 obj 对象中的 this 指代的是 window ,也就是全局环境,故箭头函数中的 this 就会就近找到上一个对象中 this 所指代的对象。 obj 内部属性 y 就为 obj 内部 this 指代的对象,输出是 window .

关于这点,解释的还不是太清楚,再补充!


以上所述就是小编给大家介绍的《this, call, apply 和 bind》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

设计模式之禅(第2版)

设计模式之禅(第2版)

秦小波 / 机械工业出版社 / 2014-2-25 / 89.00元

本书是设计模式领域公认的3本经典著作之一,“极具趣味,容易理解,但讲解又极为严谨和透彻”是本书的写作风格和方法的最大特点。第1版2010年出版,畅销至今,广受好评,是该领域的里程碑著作。深刻解读6大设计原则和28种设计模式的准确定义、应用方法和最佳实践,全方位比较各种同类模式之间的异同,详细讲解将不同的模式组合使用的方法。第2版在第1版的基础上有两方面的改进,一方面结合读者的意见和建议对原有内容中......一起来看看 《设计模式之禅(第2版)》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具