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

时间:2019-08-25 15:21:08

标签: javascript

我通过“。”初始化了一个函数变量。功能之外。关于闭包规则,应将其设置在功能范围内,并在执行后消失。但是

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

我通过“。”在函数外部初始化了变量。就像f1.a =“任何变量”。

  1. 我检查了在没有“。”的函数内部是否可以访问外部初始化的函数的变量:
    我试图访问函数内部的变量。似乎我可以不使用“。”而直接访问变量。它给我一个错误“变量未定义”。

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


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 =“ any variable”中初始化的,但是我只能通过“。”访问。

  2. 我希望变量“ a”在执行f1()之后会消失,但它仍然存在

1 个答案:

答案 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.闭包。