为什么这个自调用函数中的console.log没有被执行?

时间:2012-09-14 02:43:42

标签: javascript

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

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

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

[编辑]我想问一个更好的方法就是问#34; ff里面的f函数什么时候执行?"。我认为ff.f的价值是"未定义"我觉得很奇怪。如果在执行ff之前它没有被执行。难道不是它的功能吗?

1 个答案:

答案 0 :(得分: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时,您正在查找函数f上名为ff属性 - 默认情况下,没有此类属性。即使你这样做了:

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

ff.f仍然是undefined(因为IIFE不会返回任何内容)。