【发布时间】:2018-07-12 10:34:51
【问题描述】:
免责声明:有人警告我,这个问题可能会被否决。如果您不这样做,我将不胜感激——我在 Javascript 课程中向我的老师询问了解释,但他不知道,所以我想我会在这里问...
我正试图绕过this 并一直在阅读凯尔辛普森,但遇到了一个我不明白的案例。
据我了解,当您在另一个函数中调用一个函数时,如果该函数被称为“独立”(请参阅此处的辛普森: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 引用被调用的函数,而不是“调用者”或定义它的默认情况。
知道这里发生了什么吗?
【问题讨论】:
-
"当你在另一个函数中调用一个函数时, this 会从它定义的地方获取它的作用域。" 不,你需要一个箭头函数来实现这一点。另请注意,第二个 sn-p 不是 IIFE。
-
我正在使用您的 IIFE 获取
window,而不是globo。顺便说一句,您的 IIFE 缺少第一个括号。 -
function calling(x) {....}(function globo() { ...})在语法上等价于function calling(x) {....}; (function globo() { ...}),并产生globo作为其值。globo没有得到console.log'd,没有函数被执行,它只是控制台返回最后一次评估的结果,就好像你写了1;2;3,它会显示3。正如其他人已经说过的那样,您缺少!、+、(...)或其他强制解析器将其评估为 IIFE 的方式。
标签: javascript this iife