调用传递给JQuery处理程序的函数

Ada*_*ady 3 javascript jquery

function test() {
  var str = 'adarsh';

  // f1(); - This gives an error.
  $('body').click(function f1() {
    console.log(str);
  });
}

test();
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

我想知道为什么上面的代码片段在我尝试访问f1()函数测试时会出错.

作用f1范围是什么?
我知道它不是窗口,因为window.f1在执行上面的代码片段后我无法访问.

注意:我知道我可以先声明函数f1然后在click函数中传递对它的引用.但是,如果我们无法通过该名称访问它们,我想知道在这种情况下命名"匿名"函数的重点是什么.

Que*_*tin 5

函数声明将:

  • 创建一个与当前作用域中的函数同名的变量.

命名函数表达式(这是你在这里)将:

  • 创建一个与该函数范围内的函数同名的变量(这对于递归调用自身很有用).
  • 评估为功能

因此,有两种方法可以访问使用命名函数表达式创建的函数:

  • 把东西放在表达式的左侧.在这种情况下,你已经通过传递它来做到这一点click(),所以click函数可以用它做一些事情
  • 从内部通过名称来调用它

在范围内没有进一步的参考test.

但是,如果我们无法通过该名称访问它们,我想知道在这种情况下命名"匿名"函数的重点是什么.

正如我所说,该变量对于递归调用它很有用.

名称(与变量不同)也很有用,因为它显示在调试器中.处理由十几个有用的名称组成的堆栈跟踪比仅仅十几个重复的名称要容易得多(anonymous function).