this的四个绑定规则是什么

发布时间:2022-11-02 09:38:04 作者:iii
来源:亿速云 阅读:179

this的四个绑定规则是什么

在JavaScript中,this关键字是一个非常重要的概念,它用于引用当前执行上下文中的对象。理解this的行为对于编写高质量的JavaScript代码至关重要。this的绑定规则主要有四种:默认绑定、隐式绑定、显式绑定和new绑定。本文将详细探讨这四种绑定规则,并通过大量示例代码来帮助读者深入理解。

1. 默认绑定

默认绑定是最常见的this绑定规则,当函数被独立调用时,this会绑定到全局对象(在浏览器中是window,在Node.js中是global)。需要注意的是,在严格模式下,this会绑定到undefined

1.1 非严格模式下的默认绑定

function foo() {
    console.log(this.a);
}

var a = 2;

foo(); // 2

在这个例子中,foo函数被独立调用,this绑定到全局对象,因此this.a指向全局变量a,输出结果为2

1.2 严格模式下的默认绑定

"use strict";

function foo() {
    console.log(this);
}

foo(); // undefined

在严格模式下,this不会被绑定到全局对象,而是undefined。因此,this.a会抛出TypeError

2. 隐式绑定

隐式绑定发生在函数作为对象的方法被调用时,this会绑定到调用该方法的对象。

2.1 基本示例

function foo() {
    console.log(this.a);
}

var obj = {
    a: 2,
    foo: foo
};

obj.foo(); // 2

在这个例子中,foo函数作为obj对象的方法被调用,this绑定到obj,因此this.a指向obj.a,输出结果为2

2.2 隐式丢失

隐式绑定在某些情况下可能会丢失,导致this绑定到全局对象或undefined

function foo() {
    console.log(this.a);
}

var obj = {
    a: 2,
    foo: foo
};

var bar = obj.foo; // 函数别名

var a = "oops, global"; // a是全局对象的属性

bar(); // "oops, global"

在这个例子中,barobj.foo的一个引用,但实际上bar是一个独立函数调用,因此this绑定到全局对象,输出结果为"oops, global"

3. 显式绑定

显式绑定是通过callapplybind方法显式地将this绑定到某个对象。

3.1 使用callapply

function foo() {
    console.log(this.a);
}

var obj = {
    a: 2
};

foo.call(obj); // 2
foo.apply(obj); // 2

在这个例子中,foo函数通过callapply方法被调用,this显式地绑定到obj,因此this.a指向obj.a,输出结果为2

3.2 使用bind

function foo() {
    console.log(this.a);
}

var obj = {
    a: 2
};

var bar = foo.bind(obj);

bar(); // 2

bind方法会创建一个新的函数,并将this永久绑定到指定的对象。在这个例子中,barfoo的一个绑定版本,this始终绑定到obj,因此this.a指向obj.a,输出结果为2

4. new绑定

new绑定发生在使用new关键字调用构造函数时,this会绑定到新创建的对象。

4.1 基本示例

function Foo(a) {
    this.a = a;
}

var bar = new Foo(2);

console.log(bar.a); // 2

在这个例子中,Foo函数作为构造函数被调用,this绑定到新创建的对象bar,因此this.a指向bar.a,输出结果为2

4.2 new绑定的优先级

new绑定的优先级高于显式绑定和隐式绑定。

function Foo(a) {
    this.a = a;
}

var obj = {};

var bar = Foo.bind(obj);
bar(2);
console.log(obj.a); // 2

var baz = new bar(3);
console.log(obj.a); // 2
console.log(baz.a); // 3

在这个例子中,barFoo的一个绑定版本,this绑定到obj。然而,当bar作为构造函数被调用时,this绑定到新创建的对象baz,而不是obj。因此,obj.a仍然是2,而baz.a3

5. 箭头函数中的this

箭头函数没有自己的this,它会捕获其所在上下文的this值。

5.1 基本示例

function foo() {
    setTimeout(() => {
        console.log(this.a);
    }, 100);
}

var obj = {
    a: 2
};

foo.call(obj); // 2

在这个例子中,foo函数通过call方法被调用,this绑定到obj。箭头函数捕获了foo函数的this值,因此this.a指向obj.a,输出结果为2

5.2 箭头函数与普通函数的区别

function foo() {
    setTimeout(function() {
        console.log(this.a);
    }, 100);
}

var obj = {
    a: 2
};

foo.call(obj); // undefined

在这个例子中,foo函数通过call方法被调用,this绑定到obj。然而,setTimeout中的普通函数有自己的this,它绑定到全局对象,因此this.aundefined

6. 综合示例

为了更好地理解this的绑定规则,我们来看一个综合示例。

var a = 1;

function foo() {
    console.log(this.a);
}

var obj1 = {
    a: 2,
    foo: foo
};

var obj2 = {
    a: 3,
    foo: foo
};

obj1.foo(); // 2
obj2.foo(); // 3

obj1.foo.call(obj2); // 3
obj2.foo.call(obj1); // 2

var bar = new obj1.foo(); // undefined

在这个例子中,foo函数被多次调用,this的绑定规则如下:

7. 总结

this的绑定规则是JavaScript中一个复杂但非常重要的概念。理解默认绑定、隐式绑定、显式绑定和new绑定这四种规则,可以帮助我们更好地编写和维护JavaScript代码。在实际开发中,我们需要根据具体的上下文来正确使用this,避免常见的陷阱和错误。

通过本文的详细讲解和大量示例代码,相信读者已经对this的绑定规则有了深入的理解。在实际应用中,灵活运用这些规则,可以大大提高代码的可读性和可维护性。

推荐阅读:
  1. 学习Java的四个阶段是什么?
  2. JavaScript中this的绑定规则是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

this

上一篇:如何使用vue代码实现数据双向绑定

下一篇:es6如何找出2个数组中不同项

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》