首页 > 解决方案 > 函数在函数中声明并稍后调用时的函数范围

问题描述

我正在努力在页面/内容脚本和扩展背景脚本之间划分工作页面脚本;并且由于通信端口没有像 Promise 一样功能的返回消息,因此内容脚本代码可以在处理下一个所需步骤之前等待后台脚本中的 Promise 完成,我一直在使用通信端口通过向对象添加函数来调用内容脚本中的函数。这运作良好,并允许promise.then在内容脚本中构建一个链,等待后台脚本承诺解决/拒绝。然而,在将 indexedDB 数据库从页面移动到扩展时,情况会有所不同。

我想在内容脚本中做这样的事情。

var f = new Object();            
f.db_event_1 = function()
  {
    // Prepare data.
    // Declare functions for background script to invoke in content script
    // for oncomplete and onerror/onabort events.

    f.db_event_1_.complete = function() { };
    f.db_event_1_.error = function() { };

    // Communicate with background script, passing data, database name, object store 
    // names, etc. and invoke database transaction in the background script.

    // Wait (not an asyc function wait) for background script to invoke either of the 
    // above two functions based upon whether the transaction succeeds or fails.

  };

我没有完全掌握函数变量的范围,并执行了一些简单的测试来确定函数中声明的变量在以后调用时如何被该函数中声明的函数“记住”。例如,我不明白为什么f.func_outer.inner在声明时“记得” x 是 3 而 y 是 5。

是否可以依赖它f.func_outer.inner总是以这种方式“记住”变量?

如果变量很大,是否应该在结束时将它们设置为 nullfunc_outer.inner以破坏所有变量引用以避免潜在的内存泄漏?

谢谢你。

var f = new Object();            
f.func_outer = function( x )
  {
    console.log( 'func_outer x = ' + x + ', y = ' + y );
    f.func_outer.inner = function()
      {
        console.log( 'func_outer.inner x = ' + x + ', y = ' + y );
      };
  };
f.func_outer( 3 );   // logs func_outer x = 3, y = 5.
f.func_outer.inner();  // logs func_outer.inner x = 3, y = 5.

标签: javascriptscope

解决方案


是的,你可以依靠它。它在 js 中被称为闭包,更多关于这个主题的信息可以在这里找到https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures


推荐阅读