Nodejs 请问这段代码的 this 是怎么得出的?
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
是怎么得出的?
模块里的 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
的关键在于知道函数是如何被调用的,而不是函数在哪里被定义。以下是一些常见的例子和解释,以及相应的代码展示:
-
全局作用域中的
this
:console.log(this === global); // true in Node.js
-
对象方法中的
this
:const obj = { prop: 42, method: function() { console.log(this.prop); // 42 } }; obj.method();
-
构造函数中的
this
:function Person(name) { this.name = name; } const person = new Person('Alice'); console.log(person.name); // Alice
-
箭头函数中的
this
: 箭头函数不绑定自己的this
,而是继承父执行上下文中的this
值。const obj = { prop: 42, method: () => { console.log(this.prop); // undefined, 因为箭头函数中的 this 指向全局对象或未定义(严格模式下) } }; obj.method();
-
显式绑定
this
: 使用call
、apply
或bind
方法可以显式设置this
的值。function greet() { console.log(this.greeting); } const person = { greeting: 'Hello' }; greet.call(person); // Hello
理解这些规则后,你可以根据具体的函数调用方式推断出 this
的值。