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

标签 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 =“任何变量”内进行了初始化,但我只能通过“.”进行访问。

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

关于javascript - 为什么通过 "."在外部声明的函数变量只能通过函数内部的 "."访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57647282/

相关文章:

javascript - 如何呈现 jQuery Mobile UI 对象后页面加载

javascript - URL随React Router更改但组件未渲染?

javascript - 如何获取数据表行值并路由到另一个函数?

文本区域的 javascript 字符计数...不起作用,但它适用于 <input type ="text">'s

javascript - 为什么 Angular ng-hide 不能正确更新

javascript - 双击后防止文本选择

javascript - 从 wav 文件中读取样本

javascript - 使用 jQuery 从 URL 获取查询字符串

javascript - Redux Thunk函数后的回调: Uncaught TypeError: Cannot read property 'then' of undefined

javascript - 如何配置我的前端 JavaScript 应用程序?