当前位置: 首页 > 知识库问答 >
问题:

回调函数是否在javascript中创建了新的作用域

淳于熙云
2023-03-14
function hello() {
  var result = [];
  var str = 'I am here';
   function inner() {
    var result = [];
     for (var i=0;i<10;i++) {
        result.push(i);
     }
     return result;
   }
}

在上面的代码中,当我调用函数hello()时,返回值是一个空[],而且它没有console.log内部函数的str。但是,在下面的代码集中,我使用了一个回调函数:

 function forEach(cb) {
   for(var i =0;i<10;i++) {
    cb(i);
   }
}

function hello() {
   var result = [];
   var str = 'I am here';
   forEach(function(num) {
    console.log(str);
     result.push(num);
   }); 
   return result;
}

问题是为什么两个函数都做出了反应,并给出了不同的输出?注;在这两个代码中都有一个内部函数,它应该创建一个可以访问外部作用域的新作用域?有人对这个问题有很好的解释吗?谢谢

共有1个答案

柯冯浩
2023-03-14

在第一个代码块中,inner是在hello中声明的一个新函数。它不会执行,因为您没有调用它。当调用hello时,它确实会在其内部创建一个新的子作用域。但是,由于hello()实际上并不返回任何内容,也不调用inner(),因此当调用hello()时,将得到undefined。您可以通过更改为以下内容来解决这个问题(您可以运行此代码片段以查看返回值):

function hello() {
    var str = 'I am here';

    // declare inner
    function inner() {
        var result = [];
        for (var i = 0; i < 10; i++) {
            result.push(i);
        }
        return result;
    }

    // now call inner() and return its result
    return inner();
}

console.log(hello());
 类似资料:
  • 我学到了两件事: -操作符创建一个新实例,然后执行声明的connstuctor来初始化该新实例 根据我的理解,这些说法互相反对。 例如,不会创建两个实例,因为-操作符创建一个实例,构造函数调用并创建另一个实例?当然不会,但现在到底是什么创建了一个实例。。。?

  • 问题内容: 在Java中,数组是AN对象。我的问题是…创建新数组时是否调用了Object构造函数?我们希望利用这一事实来为Object构造函数提供一些额外的字节码,以检查所构造数组的长度。那行得通吗? 问题答案: 就Java语言规范而言,尽管它们都使用关键字,但类实例创建表达式和数组创建表达式是不同的表达式形式,每种都有自己的规则。数组创建表达式的描述未提及调用构造函数。

  • 问题内容: 我了解将一个函数作为回调传递给另一个函数并让其执行,但是我不了解执行此操作的最佳实现。我正在寻找一个非常基本的示例,例如: 在myFirstFunction中,如果我确实返回了新的callback(),则它可以工作并执行匿名函数,但这对我来说似乎不是正确的方法。 问题答案: 你可以说 或者,如果要在回调中调整的值,则可以使用该方法。 函数内部将是任何东西。

  • 我传递给Builder的lambda被填充到对象中,并定期(每小时)调用以刷新其他成员。它第一次被成功调用。我不确定lambda是否保留了,来合法地调用反向JNI函数? 我好像收到了11号信号错误,西格夫。这种分段错误是否可以以任何方式捕获,这样应用程序就不会崩溃? 它似乎在-

  • 问题内容: 如果返回错误,是否仍在调用? 问题答案: 不,延迟功能不会运行。 这是log.Fatal的描述: 致命等同于Print(),然后调用os.Exit(1)。 呼叫,其描述在这里: 退出使当前程序以给定的状态码退出。按照惯例,代码零表示成功,代码零表示错误。程序立即终止;延迟功能未运行。 示范 如果您确实需要在程序完成之前正确关闭资源或执行某些任务,请不要使用。

  • 问题内容: 我需要做的就是在当前函数执行结束时执行一个回调函数。 此功能的使用者应如下所示: 我该如何实施? 问题答案: 实际上,您的代码将按原样工作,只需将回调声明为参数即可,您可以使用参数名称直接调用它。 基础知识 那会叫,这会叫,这会提醒“东西在这里”。 请注意,传递函数 引用 ()而不是调用函数并传递其结果()非常重要。在您的问题中,您可以正确执行此操作,但是值得指出,因为这是一个常见错误