我希望有人可以解释javascript的以下用法...
我有一个页面,里面有一个脚本标签,内容如下所示
(function($){
// code
// and stuff
})(jQuery);
我只是想了解这主要是什么,
谢谢!
答案 0 :(得分:5)
这是一个匿名函数。
当jQuery(使用“$”)与另一个库(原型也使用“$”)冲突时,通常会使用您提供的具体示例。
这样做是说在函数中使用“$”时,它就是引用jQuery对象。
正常:
$("foo").doStuff()
避免冲突:
jQuery("foo").doStuff()
使用匿名函数避免冲突:
(function($){
$("foo").doStuff();
})(jQuery)
答案 1 :(得分:2)
在最高级别,它声明一个函数并在同一语句中调用它。
让我们把它分解成组成部分:
首先,我们可以在函数中使用$
作为参数/变量名,就像其他任何东西一样:
function foo($)
{
alert($);
}
foo('hi'); //alerts 'hi'
其次,我们可以为变量分配一个函数:
var foo = function($) {
alert($);
}
foo('hi'); //alerts 'hi'
最后,我们不必提供函数名称 - 我们可以声明它们。我们将它们包装在括号中以将整个函数声明封装为var,然后我们调用它(就像上面一样):
(function($) {
alert($);
})('hi');
在您的情况下,jQuery
是将某个对象作为$
参数传递给函数。可能是jQuery库的根对象,所以你可以调用它上面的函数。
答案 2 :(得分:0)
括号包装匿名函数,因此可以立即调用它,参数是对jQuery的引用
$
是JavaScript中的有效变量名,因此许多框架使用它来简化。通过将其作为函数参数包含在此处,您说要使用$
作为jQuery的别名。这使您可以尽可能缩短代码并节省用户的带宽。
在第一部分回答 - 您正在向匿名函数发送对jQuery对象/框架的引用。
答案 3 :(得分:0)
简言之:
这声明了一个匿名函数,它接受一个参数,由$的局部变量名称引用,然后立即调用作为jQuery对象的第一个参数传递的函数。
简短地说:
在javascript中,函数声明如下:
function foo(arg1,arg2){
}
稍后可以调用函数foo:
foo(“arg 1”,“arg 2”);
但在javascript函数中是一等公民;如果您愿意,可以将函数存储在变量中。执行此操作时,变量名称是函数名称,因此您可以这样写:
var foo = function(arg1,arg2){
};
后面的分号是必需的,因为变量声明(和赋值)是一个语句。之后,可以调用函数foo:
foo(“arg 1”,“arg 2”);
这里的优点是你可以将函数传递给另一个函数,或者将它存储在一个数组中,或者其他什么。这种函数称为匿名函数(因为它们没有函数名)。
在匿名函数foo中,如上所示,您可以声明局部变量,这些变量保留在该函数的范围内,并且不存在于声明函数的范围内。例如,本地arg1和arg2变量不存在于变量foo的范围内(但它们确实存在于foo中存储的匿名函数中)。
这个技巧允许我们创建一个私有块,我们可以在其中控制所命名的内容,而不必担心踩踏别人的命名空间。
您可以按如下方式编写您提供的示例:
var foo = function($){
}; FN(jQuery的);
这是同一件事,但有那个丑陋的中间变量。可能不明显的是,匿名函数的声明“返回”一个函数引用,可以稍后调用......或者同时,仅通过添加()的函数调用语法。
代码正在做的是定义一个匿名函数,它创建一个私有作用域,然后立即调用它而不存储在变量中。像这样:
功能(ARG1){
}(“arg 1”);
我不完全确定为什么匿名函数定义会有一组额外的括号,但它们至少使代码更具可读性/逻辑性。您只是将一个参数传递给括号表达式的结果,该结果恰好是一个函数:
(函数(ARG1){
})(“arg 1”);
所有这些都允许jQuery拥有一个名为jQuery的全局范围变量,但也允许用户使用$的简写而不与其他使用相同名称的javascript框架冲突。
答案 4 :(得分:-1)
让我们首先看一下内部函数声明:
function($){
// code
// and stuff
}
这是一个匿名函数声明,其中一个参数名为$
。然后将该函数包装在括号中,并通过(jQuery)
作为参数附加jQuery
来调用。