JavaScript命名自调用函数

3

我有几段代码,感觉可以压缩一下,但是不确定如何压缩。

我的代码如下:

var checkForUnitReferred = function () {
    $("#LeadForm").toggle($("#Claim_UnitReferredNoNull").is(":checked"));
};
checkForUnitReferred();

$("#Claim_UnitReferredNoNull").change(function() {
    checkForUnitReferred();        
});

它基本上检查复选框是否被选中并显示表单,否则隐藏它。我更希望有这样的东西

var checkForUnitReferred = (function() {
    $("#LeadForm").toggle($("#Claim_UnitReferredNoNull").is(":checked"));
})();

$("#Claim_UnitReferredNoNull").change(function() {
    checkForUnitReferred();        
});

我知道这样不行,但我认为这样做会更简洁。有人知道如何实现吗?


1
你的意思是想在最初和每次更改事件时调用 checkForUnitReferred 吗?我不认为你的第二段代码一定更干净... - El Ronnoco
是的,那就是我想做的,我只是不喜欢声明一个函数然后立即调用它,我更希望在声明时就调用它并且可以传递参数。 - Jimmy
1
+1 给 Hypnotoad... +1 给 Hypnotoad... +1 给 Hypnotoad... - Ben
2个回答

5
这个怎么样:
var checkForUnitReferred;

(checkForUnitReferred = function() {
    $("#LeadForm").toggle($("#Claim_UnitReferredNoNull").is(":checked"));
})();

$("#Claim_UnitReferredNoNull").change(function() {
    checkForUnitReferred();        
});

这是可能的,因为赋值 (=) 运算符会返回设置的值。

2

直接命名函数而不是创建一个匿名函数并将其分配给变量。您也可以将此函数分配为.change()处理程序,而无需额外的包装函数:

(function checkForUnitReferred() {
    $("#LeadForm").toggle($("#Claim_UnitReferredNoNull").is(":checked"));
})();

$("#Claim_UnitReferredNoNull").change(checkForUnitReferred);

对我不起作用,在页面加载时可以工作,但更改事件没有触发。 - Jimmy
@lonesomeday:实际上这里没有提升:括号确保函数被解析为命名函数表达式而不是函数声明。既然如此,在IE中,这会带来自己的问题,因此应该避免使用:http://kangax.github.com/nfe/ - Tim Down
@Tim,感谢你提供的链接,我承认我的错误。尽管由于IE中存在的漏洞,这是唯一可以使用的浏览器。 - David Tang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接