【问题标题】:Trying to simplify some Javascript with closures尝试使用闭包简化一些 Javascript
【发布时间】:2010-05-15 15:33:46
【问题描述】:

我正在尝试简化一些使用闭包的 JS 代码,但我一无所获(可能是因为我不了解闭包)

我有一些看起来像这样的代码:

var server = http.createServer(function (request, response) {
    var httpmethods = {    
        "GET": function() {
            alert('GET')
        },
        "PUT": function() {
            alert('PUT')
        }
    };
});

我正在尝试以这种方式简化它:

var server = http.createServer(function (request, response) {
    var httpmethods = {    
        "GET": function() {
            alertGET()
        },
        "PUT": function() {
            alertPUT()
        }
    };
});

function alertGET() {
    alert('GET');
}

function alertPUT() {
    alert('PUT');
} 

不幸的是,这似乎不起作用...... 因此: - 我究竟做错了什么? - 是否有可能做到这一点? - 怎么做?

TIA

-- MV

【问题讨论】:

  • doesn't seem to work 不是一个非常精确的问题描述。
  • 如果您遇到alertGET is undefined 类型的错误,您应该尝试将函数声明放在server 函数之前。除此之外,这似乎完全合法。
  • 是什么让你觉得将匿名函数移到外面是在简化事情?
  • 你的代码应该可以工作,你需要说明什么不工作(预期的行为是什么)以及你得到什么样的错误信息。

标签: javascript closures


【解决方案1】:

没有正确设置对象,您将函数名称作为字符串放在 httpmethods 对象中,而不是给它们命名 - 尝试如下操作:

var server = http.createServer( function (request, response) {});

var httpmethods = {
    get: function() { 
      alertGET()
    },
    put: function() {
      alertPUT()
    }
};

function alertGET() {
        alert('GET called');
}

function alertPUT() {
        alert('PUT called');
}

httpmethods.get()
httpmethods.put()

这是您在对象内部定义方法的方式,但不确定您在其中拥有的其他内容(http.createServer()...?)

【讨论】:

  • 我不知道 http.createServer() 方法里面有什么。没有看到整个代码,这有点棘手,但基本问题是你定义 .get() 的方式和 httpmethods 对象上的 .put() 函数。去掉引号,应该没问题。
  • 引号没有问题 - 它们完全合法。
  • 这个例子完美地举例说明了对象字面量的属性,但并没有证明闭包。
猜你喜欢
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多