我已经为网络编程已经有一段时间了,但是最近才发现了一些关于函数使用的新复杂性以及你可以用它们做的奇怪的事情(或者我认为它们)。但是,它们在这一点上似乎只是语法上很漂亮的东西。我希望有人可以告诉我这些新发现的方面如何证明是有用的。
例如,我第一次运行它时,我认为它不会起作用:
<script>
function x(q)
{
q(x);
}
x(function(a)
{
alert(a);
}
);
</script>
但确实如此!不知何故,创建一个命名函数,它接收一个不同的匿名函数作为其唯一的参数,然后运行传递给它的函数,并将其作为参数传递给它就可以了。这让我大吃一惊,我几乎可以肯定它有很大的实用性,但我还是不能完全放下它。
啊,还有一件事让我高兴地发现:使用全局范围的变量来存储函数,可以在执行后期使用JavaScript的eval()函数来修改该变量,从而动态地改变函数的内部工作。一个例子:
<script>
var f = function()
{
alert('old text');
}
eval('f = ' + f.toString().replace('old text', 'new text'));
f();
</script>
果然,该代码警告“新文本”字符串;当我看到这一点时,我的思绪再一次被吹嘘,但也立即对创造出令人难以置信的东西的潜力感兴趣。
所以...我对Stack Overflow的问题:如何以任何积极的方式使用这些看似抽象的编码原则?
答案 0 :(得分:5)
你基本上要问的是如何将函数用作一等对象?
最大和最常见的用法是用于事件处理的闭包(或匿名函数)。但是,仅仅因为你可以聪明,这并不意味着你应该。编写清晰易读的代码,就像使用任何其他语言一样。
哦,为了输入eval而鞭打自己,从不再考虑再做一次
答案 1 :(得分:3)
第一个,闭包,在javascript中很常见。如果你想要一些更高级的例子,这里有一个很好的互动游乐场,你可以搞砸:http://ejohn.org/apps/learn/。
这是我在{I}工作时使用的window.onload
函数,不需要完整的库。
//add events to occur on page load
window.addOnload = function(fn) {
if (window.onload) {
var old = window.onload;
window.onload = function() {
old();
fn();
}
} else {
window.onload = fn;
}
}
然后每当我需要在onload上发生某些事情时,我就可以使用匿名函数。这是我最近的一个维护项目的例子。
//make all menu items have a hover property
window.addOnload(function(){
var cells = document.getElementsByTagName('td');
for (var i=0; i < cells.length; i++) {
if (cells[i].className != 'NavMenuItem') continue;
(function(cell){
cell.onmouseover = function() {
cell.className = 'NavMenuItemHighlight';
}
cell.onmouseout = function() {
cell.className = 'NavMenuItem';
}
})(cells[i])
}
});
至于你的第二个'发现',只是假装你从来没有发现它。
答案 2 :(得分:0)
嗯,第一个通常是你如何证明停止问题是不可判定的......
你是否认为“有用”完全取决于你,我猜B - )