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;
我想知道为什么当我尝试在函数测试中访问f1()
时,上面的代码片段会出错。
作用范围f1
的功能是什么?
我知道它不是窗口,因为在执行上述代码片段后我无法访问window.f1
。
注意:我知道我可以先声明函数f1
,然后在click
函数中传递对它的引用。但是,我想知道命名的重点是什么?匿名&#39;如果我们无法通过该名称访问它们,则在这种情况下起作用。
答案 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() {...}
(不要混淆函数声明)时,名称被绑定在函数内部,不在包含的范围内。
fun = function someName() {
alert(someName); // works
};
alert(typeof someName); // doesn't work
fun();
&#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];
}
处理程序
<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;