3

以下代码打印“true”。我可以理解为什么 ff.f 等于 undefined,但是我不明白为什么在检查这个值时 console.log("Hi") 没有在 ff.f 内部执行。f 不是在定义后立即执行吗?

var ff = function(){
    var f = function(){
        console.log("Hi");
    }();
};

console.log(ff.f === undefined);

[编辑] 我想问这​​个问题的更好方法是“ff 中的这个 f 函数什么时候执行?”。我认为如果 ff.f 的值在 ff 被执行之前没有被执行,那么它的值是“未定义的”是很奇怪的。不应该是函数吗?

4

1 回答 1

4

不,它不是 - 它在评估后执行- 在这种情况下是执行函数 ( ff) 时。

什么时候f执行

任何 IIFE 一旦被评估就会被执行 - 任何包含在其他函数中的此类表达式只会在它的作用域(包装)执行后才被评估:

// Executed when the execution flow reaches this point
// i.e. immediately after the script starts executing
var outer = function() {
    console.log("Hello from outer");
}();

var wrapper = function() {
    // Executed when the flow reaches this point
    // which is only when the function `wrapper`
    // is executed - which it isn't, so this never fires.
    var inner = function() {
        console.log("Hello from inner");
    }();
};

为什么ff.f不是函数

JavaScript 是函数作用域,但 JavaScript 没有提供任何访问函数内部作用域的方法(据我所知,至少没有)。因此,当您尝试访问时,ff.f您正在寻找函数上命名的属性- 默认情况下没有这样的属性。即使你这样做了:fff

var ff = function () {
    ff.f = function() {
        console.log("Hello from f");
    }();
};

ff.f仍然是undefined(因为 IIFE 不返回任何东西)。

于 2012-09-14T02:46:03.790 回答