在下面,我对语法
感到困惑(function (h,j) { })
在javascript中有一个函数坐在里面()是什么意思?
function myfunc(c, b) {
try {
(function (h, j) {
//do a bunch of stuff
})
} catch (e) {
myerror(e)
}
};
答案 0 :(得分:15)
这样的函数声明本身就没用了。这种声明仅在您实际调用函数时才有用,如下所示:
(function (h, j) { ... } (x, y));
通常这样做是为了隐藏变量,因为JavaScript只有函数作用域(没有块作用域)。
一些例子 - 希望这些不会混淆......
正如评论中所提到的,此技术对于将变量保持在全局范围之外非常有用。例如,某些初始化脚本可能会执行以下操作:
(function () {
var x = 42;
var y = 'foo';
function doInitialisation(a, b) {
// ...
}
doInitialisation(x, y);
}());
在功能完成后,x
,y
或doInitialisation
都不可见。
另一个用例是避免循环中的闭包。例如。以下是一个众所周知的问题:
var links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
links[i].onclick = function () {
alert(i);
};
}
在上面的示例中,每个onclick处理程序共享i
的相同值。功能范围可以避免这种情况:
var links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
links[i].onclick = (function (x) {
return function() {
alert(x);
}
}(i));
}
答案 1 :(得分:4)
()
是一个分组运算符,它返回计算其中表达式的结果。
所以,而
> function(x,y) {}
SyntaxError: Unexpected token (
本身就是SyntaxError
,但是通过用括号括起来,括号内的表达式会被评估并返回。
> (function(x,y) {})
function (x,y) {}
函数表达式和声明不会产生任何值,因此我们得到undefined
。
功能声明
> function a(x,y) {}
undefined
功能声明(带分组操作符)
(function a(x,y) {})
function a(x,y) {}
功能表达
> var x = function(x,y) {}
undefined
函数表达式(使用分组运算符)
> var x;
> (x = function(x,y) {})
function (x,y) {}
但是,您示例中的用法似乎毫无用处。它什么都不做。
答案 2 :(得分:1)
这种语法就是所谓的Anonymous Function。大多数情况下,您会看到它们用作各种其他函数调用的回调(例如,在jQuery中)。
答案 3 :(得分:1)
这是一种内联函数,因此您可以利用协方差的优势。我的意思是,在里面
(function(h,j){
//做一堆东西
})
您可以访问包含函数的变量,这里是function myfunc(c, b) {}