我在函数外部通过"."初始化了一个函数变量。关于闭包规则,它应该在函数范围内设置,执行后应该消失。但
- 为什么调用函数变量后仍然存在?
- 为什么我只能通过"."访问函数内部?
我通过"."初始化函数外部的变量,就像f1.a ="任何变量"一样。
我检查了外部初始化的函数变量是否可以在没有"."的函数内访问:
我试图访问函数内的变量。似乎如果我在没有"."的情况下单独访问变量,它会给我一个错误"变量未定义"。
我检查了函数执行后外部初始化的函数变量是否会消失:
我调用函数并检查执行后变量的值是否仍然可用。是的,它仍然在那里。
f1.a = "any variable";
function f1(){
(function()
{
console.log(a);
}()) // a is not defined
}
f1();
console.log(f1.a); // after f1(), f1.a still exist
我希望变量"a"在"f1"中单独可见,因为我在函数作用域 f1.a = "任何变量"中初始化,但我只能使用 "." 访问。
我预计变量"a"在执行 f1() 后会消失,但它仍然存在
您需要了解几件事才能清楚地了解这里发生的事情。首先,JavaScript 将函数定义提升到文件顶部。
知道了这一点,你可以想象你的代码是这样的,一旦JavaScript解释它:
var f1 = function (){
(function()
{
console.log(a);
}()) // a is not defined
}
f1.a = "any variable"
f1();
console.log(f1.a);
其次,在你的第一个console.log(a)
中,你引用了一个从未声明过的变量a
。如果将其更改为console.log(f1.a)
,你将按预期看到f1.a
的值。
也不清楚为什么要在f1
函数中使用立即调用的函数。它使分析此代码变得更加复杂。您似乎正试图更好地了解闭包的工作原理?但是对于闭包,你应该对在f1
内部声明的变量感兴趣,而不是f1
的属性。例如,像这样的东西。
f1 = function (){
var a = 'something'
return function()
{
console.log(a);
}
}
var closure = f1();
// f1 is finished running here.
closure(); // closure still has access to f1's variable.
我认为您可以更多地了解理解上述代码的三个领域是 1。范围,特别是吊装 2.对象、this
和对象属性以及 3.闭 包。