2

我正在阅读 javascript:Douglas Crockford 的精彩部分。我很难理解一个特定的例子和作者提供的解释。

示例 1:(第 38 页)

var quo=function (status) {
    return {
        get_status:function() {
           return status;
       }
    };
};

var myQuo=quo("amazed");
document.writeln(myQuo.get_status());

书中的解释(我不明白。请解释这部分):

这个quo函数被设计成不带new前缀使用,所以名字不大写。当我们调用quo时,它返回一个包含get_status方法的新对象。对该对象的引用存储在 myQuo 中。即使 quo 已经返回,get_status 方法仍然有权访问 quo 的 status 属性。get_status 无权访问参数的副本。它可以访问参数本身。这是可能的,因为该函数可以访问创建它的上下文。这称为闭包。

示例 2(第 39 页):

//make a function that assigns event handler function to array of nodes
//when you click on a node, an alert box will display the ordinal of the node

var add_the_handlers=function (nodes) {
    var helper=function(i) {
        return function(e) {
            alert(i);
        }
    };
    var i;
    for (i=0;i<nodes.length;i++) {
        nodes[i].onclick=helper(i);
    }
};

我很难理解这段代码是如何工作的,而且函数(e)是做什么的?为什么辅助函数返回函数又什么都不返回。这让我很困惑。如果有人可以用简单的语言解释,那将非常有帮助。非常感谢

EDIT:
According to the book is the bad example for the above(example 2):
  var add_the_handlers=function(nodes) {
    var i;
    for (i=0;i<nodes.length;i++) {
     nodes[i].onclick=function(e) {
     alert(i);
     };
   }
};

作者将此作为不好的例子,因为它总是显示节点的数量。

4

2 回答 2

5

我相信他在示例中所暗示的事实是,您不必复制status参数并将其传递给get_status函数,因为get_status隐式可以访问包含在定义它的上下文中的所有内容(在这种情况,quo

同样,在示例 2

在此处输入图像描述

于 2013-06-18T02:15:22.120 回答
4

为什么辅助函数返回函数又什么都不返回。

在 javascript 中,函数不必显式返回值。如果省略返回值,则为隐式return undefined;

此外,函数是对象。所以,helper()是一个javascript函数,它返回一个函数:

function(e) {
   alert(i);
}

稍后在 for 循环中,nodes[i].onclick=helper(i);此行执行helper()函数,该函数返回一个函数对象,然后将其分配给onclick节点的处理程序。

在 Bad Example 中,作者说明了一个让新手 javascript 开发人员绊倒的常见问题。

//According to the book is the bad example for the above(example 2):
 var add_the_handlers=function(nodes) {
  var i;
  for (i=0;i<nodes.length;i++) {
   nodes[i].onclick=function(e) {
   alert(i);
   };
 }

在这种情况下,新手程序员希望每个节点都显示其索引。但是,因为 onclick 处理程序在 周围创建了一个闭包i,所以 的值i被设置为外部作用域的值,最终成为i函数执行时的值,而不是像新手程序员所期望的那样分配函数时的值。因此,对于单击的每个节点,它最终都会打印相同的数字,即nodes.length数组中的节点数。

根据评论:

此外,你能解释一下 funciton(e) 中的 e 的作用吗?

在 DOM Api 中,事件处理程序都传入一个事件对象,该对象包含有关事件的信息。所以在这种情况下,e是点击事件对象。并且e未被此函数使用,因此可以省略。

于 2013-06-18T01:25:51.477 回答