【问题标题】:unable to understand these examples from the book javascript, The good parts [closed]无法从 javascript 书中理解这些示例,好的部分 [关闭]
【发布时间】:2013-06-18 01:15:55
【问题描述】:

我正在阅读 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);
     };
   }
};

作者引用这个作为不好的例子,因为它总是显示节点的数量。

【问题讨论】:

标签: javascript function object


【解决方案1】:

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

同样,在示例 2 中

【讨论】:

  • +1 漂亮的图片和很好的解释
【解决方案2】:

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

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

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

function(e) {
   alert(i);
}

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

在“坏示例”中,作者说明了一个让 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 的值strong>,而不是像新手程序员期望的那样分配函数。所以对于每个被点击的节点,它最终都会打印相同的数字,即nodes.length 或数组中的节点数。

根据评论:

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

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

【讨论】:

  • 辅助函数返回 undefined 对吗?所以我将 undefined 分配给 onclick 处理程序?如果是这样,这段代码与我刚刚在上面编辑的错误示例代码有何不同。此外,你能解释一下 funciton(e) 中的 e 的作用吗?再次感谢
  • @user1988876 不,它将函数分配给点击处理程序。不是 执行 它分配的功能。也许thisthis 会有所帮助。
  • @user1988876:不,辅助函数有一个显式返回,它返回一个函数。这就是分配给 onclick 处理程序的内容。我会更新我的答案来解决这个不好的例子。
猜你喜欢
  • 1970-01-01
  • 2011-04-17
  • 2011-05-15
  • 2015-04-05
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
相关资源
最近更新 更多