javascript中的self和this用法小结


在JavaScript中,`self`和`this`都是用于指代当前执行上下文的关键词,但它们的使用场景和默认行为有所不同。

### `this` 关键字

`this` 在JavaScript中是一个动态绑定的关键字,其值依赖于函数是如何被调用的。它通常指向调用该函数的对象,但在某些情况下(如全局环境中、使用箭头函数时、或者通过特定方式调用函数时),它的行为会有所不同。

- **在全局环境中**,`this` 通常指向全局对象(在浏览器中是 `window`,在Node.js中是 `global`)。

- **在函数内部**,`this` 的值取决于函数是如何被调用的。

- **在对象的方法中**,`this` 指向调用该方法的对象。

- **在箭头函数中**,`this` 不绑定自己的 `this`,它会捕获其所在上下文的 `this` 值,作为自己的 `this` 值。

### `self` 关键字

实际上,在标准的JavaScript中,`self` 并不是一个内置的关键字或特殊的对象,它只是一个普通的变量名。但是,在Web Worker和Service Worker的上下文中,`self` 被用作一个全局对象的引用,类似于浏览器环境中的 `window`。此外,一些开发者也会将 `self` 作为 `this` 的别名,特别是在闭包中,以确保 `this` 的值不会因外部调用而改变。

### 小结

- **`this`** 是JavaScript中一个非常强大的关键字,用于指代当前执行上下文的对象。其值取决于函数的调用方式。

- **`self`** 在标准的JavaScript中并不是一个特殊的关键字,但在某些环境(如Web Worker)中用作全局对象的引用。此外,开发者也常将其用作 `this` 的别名。

**示例代码**:


// 在全局环境中
console.log(this === window); // true

// 在对象中
const obj = {
    method: function() {
        console.log(this === obj); // true
    }
};
obj.method();

// 使用箭头函数,this不会改变
const objArrow = {
    methodArrow: () => {
        console.log(this === window); // true,因为在全局环境中定义
    }
};
objArrow.methodArrow();

// 在Web Worker中
// self.postMessage(...); // 使用self来发送消息

// 使用self作为this的别名
function useSelf() {
    const self = this;
    setTimeout(function() {
        console.log(self === this); // false,因为setTimeout的回调函数的this指向全局对象
    }, 1000);
}

const example = {
    value: 42
};
useSelf.call(example); // 显式地将this绑定到example对象

这个示例展示了`this`和`self`在不同场景下的用法。