Javascript 调用传递给JQuery处理程序的函数
Javascript 调用传递给JQuery处理程序的函数,javascript,jquery,Javascript,Jquery,功能测试(){ var str='adarsh'; //f1();-这会给出一个错误。 $('body')。单击(函数f1(){ console.log(str); }); } test() 函数“f1”的作用域是什么 它的范围不限于任何东西。函数的引用只提供给处理程序,因此没有定义指向该函数的其他内容。如果要定义函数以便在多个位置调用,则需要将逻辑更改为以下内容: function test() { var str = 'adarsh'; $('body').click(fu
功能测试(){
var str='adarsh';
//f1();-这会给出一个错误。
$('body')。单击(函数f1(){
console.log(str);
});
}
test()代码>
函数“f1”的作用域是什么
它的范围不限于任何东西。函数的引用只提供给处理程序,因此没有定义指向该函数的其他内容。如果要定义函数以便在多个位置调用,则需要将逻辑更改为以下内容:
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');
功能测试(){
var str='adarsh';
$('body')。单击(function(){//<注意此处的匿名函数
f1(str);
});
}
函数f1(str){
console.log(str);
}
test();
f1(“富吧”);
FunctionExpression中的BindingIdentifier可以从FunctionExpression的FunctionBody内部引用,以允许函数递归调用自身。但是,与FunctionDeclaration不同,FunctionExpression中的BindingIdentifier不能从引用,也不会影响包含FunctionExpression的作用域。@@@
换句话说,当您有一个函数表达式,如function someName(){…}
(不要与函数声明混淆),该名称绑定在函数内部,而不是包含范围内
fun=函数someName(){
警报(someName);//有效
};
警报(someName的类型);//不起作用
乐趣()代码>函数声明将:
- 创建一个与当前作用域中的函数同名的变量
命名函数表达式(即您在此处看到的)将:
- 在该函数的作用域内创建一个与函数同名的变量(这对于递归调用自身很有用)李>
- 作为功能进行评估
因此,有两种方法可以访问使用命名函数表达式创建的函数:
- 在表达式的左侧放置一些内容。在本例中,通过将其传递给
click()
,您已经在执行此操作,因此click
函数可以对其执行某些操作
- 从内部按名称称呼它
在test
的范围内没有进一步的参考
然而,我想知道,如果我们不能通过匿名访问函数,那么在这样的上下文中命名“匿名”函数有什么意义
正如我所说,这个变量对于递归调用它很有用
名称(与变量不同)在调试器中显示时也很有用。处理一个由十几个有用名称组成的stacktrace要比处理一个只有十几个重复的(匿名函数)
简单得多
调用传递给JQuery处理程序的函数
您可以使用jQuery.\u data()
访问并调用click
,f1
,在之外的事件处理程序。click()
功能测试(){
var str=“adarsh”;
//f1();-这会给出一个错误。
$(“正文”)。单击(函数f1(){
console.log(str);
});
var ref=$.\u数据(document.body,“events”)[“单击”][0];
日志(ref.handler,ref.handler.name);
参考handler()
}
test()代码>
单击您的f1()
函数的作用域不限于任何内容。函数的引用仅提供给处理程序。因此,您无法访问它。我在@JonathanBrooks中使用它,但它不会从点击处理程序之外的任何地方调用f1()
,这是操作要点。这里的巨人之战:DAlso有时可读性很好。例如,[1,2,3].sort(函数降序(a,b){return a
您可以在代码段中包含一个简单的函数声明
,以便更清楚地看到与命名函数表达式
的区别。