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

时间:2016-03-23 10:55:39

标签: javascript jquery



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

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

test();

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

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

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

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

4 个答案:

答案 0 :(得分:5)

函数声明将:

  • 创建一个与当前范围内的函数同名的变量。

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

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

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

  • 在表达式的左侧放置一些东西。在这种情况下,您已经将其传递给click(),因此click函数可以对其执行某些操作
  • 从内部通过名称调用

test范围内没有进一步的引用。

  

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

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

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

答案 1 :(得分:4)

  

FunctionExpression中的BindingIdentifier可以从FunctionExpression的FunctionBody内部引用,以允许函数递归调用自身。但是,与FunctionDeclaration不同,FunctionExpression中的BindingIdentifier不能被引用,也不会影响包含FunctionExpression的范围。 @@ http://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions-runtime-semantics-evaluation

换句话说,当你有一个函数表达式,如function someName() {...}(不要混淆函数声明)时,名称被绑定在函数内部,不在包含的范围内。

&#13;
&#13;
fun = function someName() {
  
  alert(someName);  // works
  
};  

alert(typeof someName); // doesn't work

fun();
&#13;
&#13;
&#13;

为函数表达式赋予名称的目的是拥有有意义的堆栈跟踪。

答案 2 :(得分:3)

  

功能是什么&#39; f1&#39;范围来?

它没有任何范围。函数的引用仅提供给处理程序,因此没有其他任何定义指向该函数的内容。如果要定义函数以便可以在多个位置调用它,则需要将逻辑更改为:

function test() {
    var str = 'adarsh';
    $('body').click(function() { // < note the anonymous function here
        f1(str);
    });
}

function f1(str) {
    console.log(str);
}

test();
f1('foo bar');

答案 3 :(得分:0)

  

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

您可以使用jQuery._data()来访问event click f1 .click() function test() { var str = "adarsh"; // f1(); - This gives an error. $("body").click(function f1() { console.log(str); }); var ref = $._data(document.body, "events")["click"][0]; console.log(ref.handler, ref.handler.name); ref.handler() } test();处理程序,<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <body>click</body>以外的- (void)xmppStreamDidConnect:(XMPPStream*)sender { self.isXmppConnected = YES; NSError* error = nil; [self.xmppStream authenticateWithPassword:@"yourJIDpassword" error:&error]; } 处理程序

&#13;
&#13;
<xsl:template name="split">
 <xsl:param name="str" select="."/>
  <xsl:choose>
    <xsl:when test="contains($str, ',')">
       <Attribute name="code">
       <Value>
        <xsl:value-of select="normalize-space(substring-before($str, ','))"/>
      </Value>
      </Attribute>
      <xsl:call-template name="split">
        <xsl:with-param name="str" select="substring-after($str, ',')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <Attribute name="code">
         <Value>
          <xsl:value-of select="$str"/>
        </Value>
      </Attribute>
    </xsl:otherwise>
  </xsl:choose>

</xsl:template>
&#13;
          <xsl:call-template name="split">
            <xsl:with-param name="str" select="substring-before(
                                               substring-after(
                                               attr[@name='temperatureQualifier'], '[' )
                                               ,']' )"/>
          </xsl:call-template>
&#13;
&#13;
&#13;