问一个有关Nodejs中call的问题
问一个有关Nodejs中call的问题
function f1()
{
console.log(this);
console.log(1);
}
function f2(){
console.log(this);
console.log(2)
}
f1.call.call(f2); //Window,2
今天研究了一下call,但是f1.call.call(f2); //Window,2
这里实在是有点不懂,为啥是这样的结果勒?
求大神解析。
5 回复
method.call(f1) ~= f1.method();
Function.prototype.call ~= f1.call ~= f2.call;
f1.call.call(f2); ~= Function.prototype.call.call(f2) ~= f2.call();
真是脑筋急转弯。
$ node
> Function.prototype.call
[Function: call]
> Function.prototype.call.call
[Function: call]
> Function.prototype.call === Function.prototype.call.call
true
那个 f1 是个幌子。
(function(){}).call.call(f2)
结果一样
在Node.js中,call
方法用于调用一个函数,并显式指定该函数内部的 this
值。当你看到 f1.call.call(f2)
这样的代码时,实际上是在连续使用 call
方法。
让我们详细分析一下这个例子:
示例代码
function f1() {
console.log(this);
console.log(1);
}
function f2() {
console.log(this);
console.log(2);
}
f1.call.call(f2); // Window,2
分析
-
f1.call
: 这里的f1.call
是Function.prototype.call
的引用。call
方法需要一个参数来设置f1
函数内部的this
值。 -
f1.call.call(f2)
: 这里实际上是f1.call
被当作一个函数调用,其第一个参数为f2
。也就是说,f1.call
的this
值被设置为f2
,然后f1.call
会继续执行。 -
f1.call
的实际调用:f1.call
中的第一个参数f2
将成为f1
的this
值。- 因此,
f1.call(f2)
实际上相当于f1.call.call(null, f2)
。
-
最终调用:
f1
函数中的console.log(this)
输出f2
(因为this
等于f2
)。- 接着
console.log(1)
输出1
。
-
全局上下文:
- 由于
f1.call
没有显式绑定到任何对象,且在全局作用域中执行,因此console.log(this)
输出的是全局对象(在浏览器中通常是window
对象,在Node.js中通常是global
对象)。 - 所以输出为
Window, 2
或者在Node.js环境中可能是global, 2
。
- 由于
总结
f1.call.call(f2)
实际上是f1.call(f2)
,其中f2
成为f1
的this
值。f1
内部的console.log(this)
输出f2
。f1
内部的console.log(1)
输出1
。- 最终
this
在全局上下文中输出为global
对象。
希望这能帮助你理解这个现象!