javascript - 局部(函数)变量在 JavaScript 中存在多久

标签 javascript

我遇到过这个例子:

function countMyself() {
// Check to see if the counter has been initialized
if ( typeof countMyself.counter == 'undefined' ) {
    // It has not... perform the initialization
    countMyself.counter = 0;
}

// Do something stupid to indicate the value
alert(++countMyself.counter);
}

上面的代码片段演示了“如何在 JavaScript 中实现静态局部变量”

我知道函数变量存储在堆栈中。拥有 C 背景的我知道堆栈中的变量很容易被后续的函数调用覆盖。

JavaScript 似乎并非如此。

什么规则指定局部(函数)变量在程序的生命周期中存在多长时间? 我的意思是 Javascript 中的 stack 必须具有与 C、C++ 中的 stack 不同的语义?

最佳答案

局部变量至少只要可访问就存在。通过关闭,他们甚至可以永远留下来:

   function noClosure() {
     let local = 3;
     //...
   } // local gets recycled here

   function closure() {
     let local = 3;
     return function inner() {
       return local; // <- closured
    }
  }

  var closured = closure();
  // local exists here:
  console.log(closured()); // 3
  // but now it might get recycled:
  closured = undefined;

在您的代码片段中,它实际上不是局部变量,而是全局函数对象的属性,该属性一直存在,直到它被删除、变得不可引用或引擎停止执行:

  delete countMyself.counter; // property deletion
  countMyself = somethingNew; // unreferencable

关于javascript - 局部(函数)变量在 JavaScript 中存在多久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51825364/

相关文章:

javascript - window.location 无法与 window.location.href 一起使用?

javascript - 如何将所选单选按钮的值带到服务器端

javascript - node.js mongodb .. (不可变)字段 '_id' 被发现已被更改

javascript - 当鼠标未悬停在元素上方时使用 onmouseout 运行?

javascript - 如何在不请求外部页面的情况下重用 Angular-JS 常见标记(例如小部件)?

javascript - 如何带参数调用coffescript函数?

javascript - 将JS小部件的属性direction=rtl更改为dir=rtl

javascript - Mapbox 只添加最后一个标记?

javascript - Google Auth 用户电子邮件不存在

javascript - 错误 : [$compile:multidir] for Component Directive with Attribute Directive