Javascript:如何在回调函数中访问局部变量?

杰曼·桑托斯(JM Santos)

我有一个强大的形式来解析请求。然后,随着该请求一起上传文件。在强大的过程中,如果有文件,您可以收听事件。

var form = new formidable.IncomingForm({
    uploadDir: __dirname + '/temp',
    keepExtensions: true
});

我将在这里聆听活动

form.on('file', function(name, file){
   var file = file;
   fs.readFile(file.path, readFileCallback);
});

function readFileCallback(err, contents){
  console.log(file);
  if (err) throw err;
  ....
}

我的第一个代码是一连串的回调函数,并且很难读取和维护,因此我使用这种方法进行切换,在该方法中我将声明函数,然后将其称为回调,而不是像这样:

form.on('file', function(name, file){
   fs.readFile(file.path, function(err, contents){
      console.log(file);
      if (err) throw err;
      .... 
  });
});

通过这种方法,我可以访问外部变量file我想知道两者在访问外部变量之间有什么区别。提前致谢。

TJ人群

这是范围的问题代码可以访问在函数中声明的变量,其包含的函数(如果有的话),其包含的函数(如果有的话)等等,然后是全局变量。

在您的第一个示例中,readFileCallback是在form.on回调外部声明的,因此它无权访问form.on回调内部的内容

在第二个例子中,该功能是里面form.on回调,所以它可以访问它里面的东西。

请注意,在第二个示例中,理论上每次调用回调时都会创建一个新函数。很好,JavaScript引擎确实可以很快地创建函数(即使创建了单独的函数对象,好的引擎也可以重用代码)。

通常,您想在最外部的位置创建该函数,在该函数中可以访问所需的所有内容。所以你的情况,这将是内部 form.on的,但外面readFile回调。您的第二个示例正是在哪里。但是,如果愿意,您可以像第一个示例一样使用命名函数,只需将其放在 form.on的回调中即可:

form.on('file', function(name, file){
   fs.readFile(file.path, readFileCallback);
   function readFileCallback(err, contents){
      console.log(file);
      if (err) throw err;
      .... 
   }
});

让我们举一个例子,其中所有的东西都有一个简单的名称,然后执行两次调用:

function outer(outerArg) {
    function middle(middleArg) {
        function inner(innerArg) {
            console.log("innerArg = " + innerArg);
            console.log("middleArg = " + middleArg);
            console.log("outerArg = " + outerArg);
        }

        inner(middleArg.toLowerCase());
    }

    middle(outerArg.toUpperCase());
}

outer包含middle其中包含innerouter电话middle(和middle电话inner)。一个电话:

outer("Test1");
  1. outer 获取arg "Test1"
  2. middle"TEST1"
  3. inner"test1"
  4. inner 输出:

    
    innerArg = test1 middleArg = TEST1 
    externalArg = Test1
    

到目前为止,如此简单,但是比这更令人兴奋:如果middle返回一个函数调用inner,而不是立即调用它,然后outer返回middlereturn的返回值,该怎么办?

function outer(outerArg) {
    function middle(middleArg) {
        function inner(innerArg) {
            console.log("innerArg = " + innerArg);
            console.log("middleArg = " + middleArg);
            console.log("outerArg = " + outerArg);
        }
        function caller() {                         // ***
            inner(middleArg.toLowerCase());         // ***
        }                                           // ***
        return caller;                              // ***
    }

    return middle(outerArg.toUpperCase());          // ***
}

现在,调用outer根本没有任何输出:

var f = outer("Test2");

但是,然后调用middle返回的函数caller)可以:

f();

输出:


innerArg = test2 middleArg = TEST2 
externalArg = Test2

参数仍然存在,outer然后middle返回!但这更有趣:

var f1 = outer("Test3");
var f2 = outer("Test4");
f2();  // Note -- calling the second one first
f1();

输出:


innerArg = test4 middleArg = TEST4 
externalArg = Test4 
innerArg = 
test3 middleArg = TEST3 
externalArg = Test3

因此,这两个调用都结束后,仍然存在两个 outerArgsouter两个 middleArgs如何?

它们存在于附加到功能的对象上:

  • 调用outer会创建一个执行上下文(一个对象),除其他事项外(还有很多细节),该上下文包含该调用和的参数和局部变量outer我们称其为“外部上下文”。它还引用了包含它的执行上下文(在我们的代码中为全局上下文)。通常,当函数返回时,该对象会被清理...
  • ...但是outer创建一个函数,middle创建函数时,当前执行上下文将附加到该函数。这样便可以在外部环境中访问变量等。
  • outer调用middle,创建一个内部执行上下文,并middle创建两个其他函数(innercaller),每个函数都将其附加到该内部上下文。middle然后返回 caller,因此caller在调用middle完成后存在由于caller具有对内部执行上下文的引用,因此即使middle返回了上下文,该上下文仍将继续存在(就像其他任何对象一样)由于该上下文引用inner,因此inner 继续存在。
  • outer返回middle(是caller的返回值,因此,callerouter返回,意味着仍然存在,这意味着它所引用的内部上下文仍然存在,这意味着inner仍然存在,并且外部上下文仍然存在,因为内部上下文对它的引用。

......这是怎么f1f2访问后这些参数outer的回报:当您运行他们,他们查找在附属于他们的背景值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在回调函数中访问局部变量

如何在Typescript的回调函数中访问“ this”?

如何在方法-Vue中访问局部变量的状态?

如何在角度2单元测试中访问方法的局部变量

如何访问局部变量(函数内部的变量)和头文件中的变量的ICElement?

重新捕获对包含数据回调回调函数中的DOM元素的局部变量的访问

如何在循环外访问局部变量?

如何在玩笑中访问局部变量

如何在Data Weave中的函数中为局部变量赋值

如何在获取调用函数返回的内容时将局部变量传递给回调?

如何在JavaScript中将变量传递给回调函数

如何从C / C ++访问lua脚本中的局部变量或调用局部函数?

更改JavaScript中的函数上下文(用于访问局部变量)

在回调函数中使用局部变量

局部变量-如何在其他if-sling中访问(python)

如何在Java / Android中的回调函数中设置局部变量?

当函数具有同义局部变量时,如何在函数中获取全局变量?

如何在Javascript中获取指向局部变量的指针?

如何在函数外部访问局部变量

局部变量在javascript的回调函数中变为未定义

如何在Bash函数中使用局部变量

为什么局部变量只有当它是父函数的输入参数时才能在回调函数中访问?

通过创建回调默认值参数使局部变量可访问

如何在回调函数中访问全局范围变量?[JS]

是否可以从 C++ 中的回调函数影响局部变量?

如何在Python中的函数中修改局部变量?

如何在python中的全局关键字之后访问局部变量

如何访问 JavaScript 函数之外的局部变量?

如何在Typescript的回调中访问类变量/方法?