以下代码打印" 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之前它没有被执行。难道不是它的功能吗?
答案 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不会返回任何内容)。