2010-05-15 54 views
-1

我試圖簡化使用關閉一些JS代碼,但我還是一無所獲(可能是因爲我不所著的Grokking閉包)試圖簡化一些JavaScript與封閉

我有一些代碼,如下所示:

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

+4

'似乎不工作'不是一個非常準確的問題描述。 – 2010-05-15 15:36:15

+0

如果你得到'alertGET是未定義的'種錯誤,你應該嘗試將函數聲明放在'server'函數之前。除此之外,這看起來完全合法。 – FK82 2010-05-15 17:26:10

+3

是什麼讓你覺得它簡化了將匿名函數移到外部的事情? – mplungjan 2010-05-16 14:55:47

回答

0

不設立目標正確,你把函數名作爲字符串內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()...?)

+0

我不知道http.createServer()方法裏面有什麼,但沒有看到整個代碼,這有點棘手,但基本問題是你定義.get()和.put()函數的方式httpmethods對象。把他們的報價拿走,它應該沒問題。 – dmp 2010-05-15 15:51:04

+1

報價是沒有問題的 - 他們是完全合法的。 – 2010-05-15 16:05:05

+0

這個例子完美地擴大了對象文字的屬性,但沒有做任何事情來展示閉包。 – 2010-05-15 18:37:25