为什么在函数外部声明的函数变量只能通过函数内部"." "."访问?



我在函数外部通过"."初始化了一个函数变量。关于闭包规则,它应该在函数范围内设置,执行后应该消失。但

  1. 为什么调用函数变量后仍然存在?
  2. 为什么我只能通过"."访问函数内部?

我通过"."初始化函数外部的变量,就像f1.a ="任何变量"一样。

  1. 检查了外部初始化的函数变量是否可以在没有"."的函数内访问:
    我试图访问函数内的变量。似乎如果我在没有"."的情况下单独访问变量,它会给我一个错误"变量未定义"。

  2. 我检查了函数执行后外部
  3. 初始化的函数变量是否会消失:
    我调用函数并检查执行后变量的值是否仍然可用。是的,它仍然在那里。


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
  1. 我希望变量"a"在"f1"中单独可见,因为我在函数作用域 f1.a = "任何变量"中初始化,但我只能使用 "." 访问。

  2. 我预计变量"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.闭 包。

最新更新