Nodejs 请问这段代码的 this 是怎么得出的?

发布于 1周前 作者 eggper 来自 nodejs/Nestjs

Nodejs 请问这段代码的 this 是怎么得出的?

(function(global) {
var foo = (function() {
var cls = function() {
console.log(this);
}
return cls;
})();

global.foo = foo;

})(this);

this.foo();

分析了一下这段代码,发现this.foo就是cls,所以调用this.foo()就等于调用cls(),而cls()就一个作用,输出当前的this值。

我记得this就是指当前函数的调用者,也就是foo的调用者,由this.foo()可以看出,foo的调用者就是全局对象global,那么这段程序就应该输出global才对,然而答案却不是global,答案是:{ foo: [Function: cls] }

请问这个this是怎么得出的?


9 回复

模块里的 this 并不等于 global


而是等于 module.exports, 本来是空对象, 但是通过 this.foo = foo 添加了属性, 所以结果也就是{ foo: [Function: cls] }

谢谢,试了试确实如此。

用 global 来命名有点容易引起歧义

<br> var cls = function() {<br> console.log(this === global, this);<br> }<br>

自己运行看结果, 看输出是 true, 还是 false?

<br>(function(global) {<br> var foo = (function() {<br> var cls = function() {<br> console.log(this === global, this, global);<br> }<br> return cls;<br> })();<br><br> global.foo = foo;<br>})(this);<br><br>this.foo();<br><br>console.log(this)<br>
再加个 log 自己看.

函数里面的 this 是往上找的, 最后 foo 是挂在 global 下面的(对象的方法), 所以给出的是 global 的值. 你不用 this, 参数传一个 object 进去也是可以的.

为什么我在浏览器中运行你的代码打印出来是 Window 然后在 node 中打印出来是 global 呢。。。

在 Node.js 中,this 的值取决于函数的调用方式。理解 this 的关键在于知道函数是如何被调用的,而不是函数在哪里被定义。以下是一些常见的例子和解释,以及相应的代码展示:

  1. 全局作用域中的 this

    console.log(this === global); // true in Node.js
    
  2. 对象方法中的 this

    const obj = {
        prop: 42,
        method: function() {
            console.log(this.prop); // 42
        }
    };
    obj.method();
    
  3. 构造函数中的 this

    function Person(name) {
        this.name = name;
    }
    const person = new Person('Alice');
    console.log(person.name); // Alice
    
  4. 箭头函数中的 this: 箭头函数不绑定自己的 this,而是继承父执行上下文中的 this 值。

    const obj = {
        prop: 42,
        method: () => {
            console.log(this.prop); // undefined, 因为箭头函数中的 this 指向全局对象或未定义(严格模式下)
        }
    };
    obj.method();
    
  5. 显式绑定 this: 使用 callapplybind 方法可以显式设置 this 的值。

    function greet() {
        console.log(this.greeting);
    }
    const person = { greeting: 'Hello' };
    greet.call(person); // Hello
    

理解这些规则后,你可以根据具体的函数调用方式推断出 this 的值。

回到顶部