我通过“。”初始化了一个函数变量。功能之外。关于闭包规则,应将其设置在功能范围内,并在执行后消失。但是
我通过“。”在函数外部初始化了变量。就像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 =“ any variable”中初始化的,但是我只能通过“。”访问。
我希望变量“ a”在执行f1()之后会消失,但它仍然存在
答案 0 :(得分:0)
要清楚了解此处发生的事情,您需要了解几件事。首先,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.闭包。