5

我已经为 Web 编程了很长一段时间,但直到最近才发现一些关于函数使用的新复杂性以及你可以用它们做的奇怪的事情(或者我认为它们是)。然而,在这一点上,它们似乎只是语法上漂亮的东西。我希望有人能告诉我这些新发现的一些方面是如何被证明是有用的。

例如,我第一次运行它时,我认为它肯定行不通:

<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 的迫切问题:如何以任何积极的方式使用这些看似抽象的编码原则?

4

3 回答 3

5

您基本上要问的是如何将函数用作一等对象?

最大和最常见的用法是用于事件处理的闭包(或匿名函数)。然而,仅仅因为你可以聪明,并不意味着你应该。编写清晰易读的代码,就像使用任何其他语言一样。

哦,鞭打自己输入 eval 并且永远不要再考虑这样做

于 2009-01-26T20:30:32.367 回答
3

第一个,闭包,在 javascript 中很常见。如果您想要一些更高级的示例,这里有一个不错的交互式游乐场,您可以随意使用:http ://ejohn.org/apps/learn/ 。

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;
    }
}

然后,每当我需要在加载时发生某些事情时,我都可以使用匿名函数。这是我最近的一个维护项目的一个例子。

//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])
    }
});

至于你的第二个“发现”,就假装你从来没有发现过。

于 2009-01-26T20:31:05.580 回答
0

嗯,第一个通常是你如何证明停止问题是不可判定的......

你是否认为“有用”完全取决于你,我猜 B-)

于 2009-01-26T20:35:39.673 回答