我通过“.”初始化了函数的变量。函数之外。关于闭包规则,应该在函数作用域内设置,并且在执行后应该消失。但是
- 为什么调用函数后变量仍然存在?
- 为什么只能通过“.”才能访问函数内部?
我通过“.”在函数外部初始化了变量。就像 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. 闭包。
关于javascript - 为什么通过 "."在外部声明的函数变量只能通过函数内部的 "."访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57647282/