我有点困惑。启动下面指定的匿名成员模式时参数的用途是什么:
(function (<ParameterA>) {
})(<ParameterB>);
最后,我经常看到脚本表示以下内容:
})(jQuery || myfunc);
这是否意味着他们正在导出这些或返回这些对象?使用两个管道(||)有什么意义;这是一个实地目标吗?
提前致谢。期待有趣的讨论。
答案 0 :(得分:4)
参数A未指定函数的范围。函数的位置决定了函数的范围。参数B不是导出函数的位置。事实上,这个设置的方式,没有指向任何地方的函数指针,使其成为“匿名函数”。换句话说,功能本身是不可导出的。通常当你谈论导出东西时,你谈论的是导出你在匿名函数中定义的变量。例如,这里我从匿名函数中导出函数my_inner_function
。
(function (<ParameterA>) {
// export this function here.
window.my_inner_function = function() {
...
};
})(<ParameterB>);
通常,匿名函数的要点是你有各种不想导出的变量,因为你不想让其他代码混淆。
(function (<ParameterA>) {
// convert could be defined somewhere else too, so to be on the safe side
// I will hide it here in my anonymous function so nobody else can
// reference it.
var convert = function() {
...
};
})(<ParameterB>);
当您压缩Javascript并获取a
和b
等函数名称时,这一点尤为重要。
(function (<ParameterA>) {
// So compressed!
var a = function() {
...
};
})(<ParameterB>);
(function () {
// Another compressed thing! Good thing these are hidden within anonymous
// functions, otherwise they'd conflict!
var a = function() {
...
};
})();
现在这个
(function (<ParameterA>) {
})(<ParameterB>);
与
相同// Assume ParameterB is defined somewhere out there.
(function () {
var ParameterA = ParameterB;
})();
这可以让您了解为何使用这些参数。您可能会发现参数方法不那么令人困惑,或者您可能希望明确表示您不希望影响“按值”变量(如数字和字符串)。
正如其他人所指出的那样,a || b
被称为“a或b”,如果a
评估为真,则表示“a
,否则b
,无论是什么b
是。“
修改强>
要回答您的问题,当您到达})();
时,()
会导致匿名函数运行。请记住,Javascript引擎将首先解析所有代码以确保语法正确,但实际上不会评估/执行任何代码,直到它到达该代码。因此,当匿名函数运行时,var ParameterA = ParameterB;
被评估。以下是一些希望有所帮助的例子。
var ParameterB = "hello";
(function () {
var ParameterA = ParameterB;
// alerts "hello" because when this line is evaluated ParameterB is still
// "hello"
alert(ParameterA);
})(); // () here causes our anonymous function to execute
ParameterB = "world";
现在在这个例子中,该函数不再是匿名的,因为它具有 一个指针。但是,它的行为与前一个示例相同。
var ParameterB = "hello";
var myFunction = function () {
var ParameterA = ParameterB;
// alerts "hello" because when this line is evaluated ParameterB is still
// "hello"
alert(ParameterA);
};
myFunction();
ParameterB = "world";
在这个例子中,我改变了最后两行的顺序并得到了不同 结果
var ParameterB = "hello";
var myFunction = function () {
var ParameterA = ParameterB;
// alerts "world" because when this line is evaluated ParameterB has
// already changed.
alert(ParameterA);
};
// notice that I moved this line to occur earlier.
ParameterB = "world";
myFunction();
答案 1 :(得分:3)
对于第1部分和第2部分,ParameterA可用于别名嵌套层次结构。 (即:YAHOO.util.Event passed
作为ParameterB,可以在ParameterA中用作“e
”。这样,在匿名函数中,您就不会输入完整的命名空间路径。 [我知道你是一个jquery家伙,但雅虎命名空间更长,并说明了更好的点:)]或者,您可以手动将引用存储在函数内的var中。
jquery || myFunc
语法是“如果它是真实的/可用则使用jquery,或者如果不是则使用myFunc”的简写。
有点像var toUse = jQuery !== undefined ? jQuery : myFunc;
这是因为javascript允许在不将对象完全转换为布尔值的情况下进行有价值的评估。 ie:undefined是falsy,“”是falsy,null是falsy。
备选方案可用于检测方法或属性是否可用于&amp;&amp;。
ie:var grandParent = person && person.parent && person.parent.parent;
仅当此人拥有父母且其父母拥有父母时,才会定义此项。沿着&amp;&amp;&amp;导致最后一个语句将导致grandParent未定义。
最后,围绕着||的parens快捷语法基本上是在声明后立即执行函数,将计算值传递给匿名函数。
ie:(function(a, b) { return a + b; })(2,3)
将立即执行并返回5.实际上,此匿名函数执行可以与模块模式一起使用,以建立一组公共方法,这些公共方法使用本身未出现在页面命名空间中的私有函数。这比原始问题更深入,但您可以查看此文章以获取更多信息:http://yuiblog.com/blog/2007/06/12/module-pattern/
答案 2 :(得分:3)
上面的代码块在声明后立即执行匿名函数。
ParameterA
是您要声明的匿名函数的参数ParameterB
是您传递给ParameterA
因此,您声明的函数将立即执行,并将ParameterB
作为ParameterA
的值传递。
jQuery || myFunc
块意味着:使用jQuery
作为参数,除非未定义,在这种情况下使用myFunc
。
修改强>
这通常在定义jQuery插件时使用,以避免在使用多个javascript库时与$
变量发生冲突。因此,您可以将插件定义设置为接受$
作为参数的函数,您将立即执行该函数,并将jQuery
作为值传递给$
。
示例(来自jQuery docs):
(function( $ ){
$.fn.myPlugin = function() {
// Do your awesome plugin stuff here
};
})( jQuery );
上述代码块的结果将是一个插件定义,保证$
将成为jQuery
的别名。
答案 3 :(得分:0)
ParameterA引用在ParameterB中传递的值。这样:
(function (<ParameterA>) {
})(<ParameterB>);
有点像这样:
function test(<ParameterA>) {
}
test(<ParameterB>);
不同之处在于,您使用闭包在全局命名空间中没有冲突的函数。
第二部分:||工作有点像param = jQuery ? jQuery : myFunc
。如果定义了jQuery,则传入jQuery;如果不是,则传递给myFunc。
答案 4 :(得分:0)
第一部分:
(function (<ParameterA>) {
})(<ParameterB>);
这意味着函数外部的ParameterB
变量将在函数内部称为ParameterA
。这被称为自执行函数,因为函数在定义后立即被调用。这意味着您可以在函数内部使用ParameterA
,而不会覆盖函数外部的变量。
例如:
(function($){
})(jQuery);
这意味着您可以将$
作为函数外部的Mootools和其中的jQuery。
第二部分:
})(jQuery || myfunc);
如果该变量存在,则调用传递jQuery
变量的函数,如果不存在,则调用myfunc
。我不太清楚为什么要这样做......