为什么 "this" 内部函数定义并传递给 IIFE 引用函数本身?
Why does "this" inside functions defined in and passed to IIFE's reference the function itself?
免责声明:有人警告我这个问题可能会被否决。如果您不这样做,我将不胜感激——我在 Javascript 课程中向我的老师询问了解释,但他不知道,所以我想我应该在这里问...
我正在努力思考 this
并一直在阅读 Kyle Simpson,但遇到了一个我不明白的案例。
据我了解,当您在另一个函数中调用一个函数时,如果该函数被调用 "standalone"(参见 Simpson 此处:You Don't Know JS: this and Object Prototypes),那么 this
应该是 Window
(或 undefined
如果它处于 strict
模式)
var fn = function globo () { console.log(this);};
function calling(called) {
console.log(called());
}
calling(fn); // "Window" or "undefined"
但是如果你将类似的函数传递给 IIFE,你会得到一个奇怪的结果
function calling(called) {
console.log(called());
}(function globo () { console.log(this);}); // [Function: globo]
这似乎是一种罕见的情况,其中 this
引用被调用的函数,而不是 "caller" 或定义它的默认情况。
知道这里发生了什么吗?
实际上,那不是 IIFE。按照你写的方式,你基本上已经定义了一个函数,calling
,你永远不会调用,然后是另一个函数,globo
,你也从不打电话。如果您在控制台中执行此代码,您将得到 globo
作为结果,因为这是您最后一个表达式的值——因为您使用了括号,所以它不是函数声明。
您可以仔细检查 运行 此代码:
function calling(called) {
console.log('foo');
}(function globo () {});
您可能会得到相同的结果。
IIFE 应该是:
(function calling(called) {
console.log(called());
})(function globo () { console.log(this)});
确实,this
returns Window
(或 undefined
)。
免责声明:有人警告我这个问题可能会被否决。如果您不这样做,我将不胜感激——我在 Javascript 课程中向我的老师询问了解释,但他不知道,所以我想我应该在这里问...
我正在努力思考 this
并一直在阅读 Kyle Simpson,但遇到了一个我不明白的案例。
据我了解,当您在另一个函数中调用一个函数时,如果该函数被调用 "standalone"(参见 Simpson 此处:You Don't Know JS: this and Object Prototypes),那么 this
应该是 Window
(或 undefined
如果它处于 strict
模式)
var fn = function globo () { console.log(this);};
function calling(called) {
console.log(called());
}
calling(fn); // "Window" or "undefined"
但是如果你将类似的函数传递给 IIFE,你会得到一个奇怪的结果
function calling(called) {
console.log(called());
}(function globo () { console.log(this);}); // [Function: globo]
这似乎是一种罕见的情况,其中 this
引用被调用的函数,而不是 "caller" 或定义它的默认情况。
知道这里发生了什么吗?
实际上,那不是 IIFE。按照你写的方式,你基本上已经定义了一个函数,calling
,你永远不会调用,然后是另一个函数,globo
,你也从不打电话。如果您在控制台中执行此代码,您将得到 globo
作为结果,因为这是您最后一个表达式的值——因为您使用了括号,所以它不是函数声明。
您可以仔细检查 运行 此代码:
function calling(called) {
console.log('foo');
}(function globo () {});
您可能会得到相同的结果。
IIFE 应该是:
(function calling(called) {
console.log(called());
})(function globo () { console.log(this)});
确实,this
returns Window
(或 undefined
)。