代码之家  ›  专栏  ›  技术社区  ›  Hexagon Theory

关于JavaScript函数的非正统性

  •  5
  • Hexagon Theory  · 技术社区  · 16 年前

    我为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>
    

    果然,这段代码提醒了“new text”字符串;当我看到这一点时,我的脑子再次被炸飞了,但也立即对创造不可思议的东西的潜力产生了兴趣。

    3 回复  |  直到 16 年前
        1
  •  5
  •   Kevin    16 年前

    你的基本要求是 如何使用函数作为一级对象?

    噢,还因为输入eval和 从未 再想一次

        2
  •  3
  •   TJ L    16 年前

    第一个闭包在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])
        }
    });
    

        3
  •  0
  •   Brian Postow    16 年前

    好吧,第一个问题是你如何证明这个问题是不可判定的。。。