2012-04-15 1 views
9

전체 내용은 my other question을 확인하십시오. 그것은 다음과 같은 코드를 소켓 핸들러의 이름이 기능을 사용하는 것이 더 효율적이라면V8 내부 - 익명 함수 처리

기본적으로, 내가 물어 봤다 :

var app = require('express').createServer() 
var io = require('socket.io').listen(app); 

app.listen(8080); 

// Some unrelated stuff 

io.sockets.on('connection', function (socket) { 
    socket.on('action1', function (data) { 
     // logic for action1 
    }); 

    socket.on('action2', function (data) { 
     // logic for action2 
    }); 

    socket.on('disconnect', function(){ 
     // logic for disconnect 
    }); 
}); 

전체 응답, 예 (자세한 내용은 위의 링크를 참조)했지만,

내가 V8 내부에 익숙하지 않아요하지만 단지 첨부 된 다른 범위로, 한 번 기능을 컴파일하고 다시 사용할 때마다 그것을 똑똑 수 있습니다 : 다음과 같은 코멘트 ThiefMaster에 의해 게시했습니다.

이제 제 질문입니다. V8은 익명 기능을 한 번 컴파일하고 익명 기능이 일반적으로 여러 함수 인스턴스를 생성하는 상황에서 다른 범위로 재사용 할만큼 충분히 똑똑합니까? 예를 들어 위의 경우 connection 이벤트에 대한 처리기가 한 번 생성되지만 각 연결에 대해 action1, action2disconnect에 대한 처리기가 만들어지기를 기대합니다. 다른 질문에 이것은 명명 된 함수로 해결되었지만 이것이 V8에서 필요하거나 최적화가 필요한 경우 더 관심이 있습니다.

+0

이 기능은 지명 된 또는 익명의; 각 연결에 대해 새 함수를 작성하는지 여부와 관계가 있습니다. (자세한 내용은 내 대답을 참조하십시오.) –

답변

6

예. 내가 asked a very similar question (제 경우에는 생성자 함수 내에서 함수를 만드는 것과 관련이 있습니다) V8 메일 링리스트에 있습니다. 함수의 코드은 "... 일반적으로 재사용되었습니다 ..."라는 회신을 받았습니다. 별개의 함수 인 개체가있을 때마다 (사양에서 요구하는대로)입니다.


귀하의 질문은 기능이 명명되었는지 또는 익명인지 여부와 관련이 없습니다. 완벽하게 유효한 V8에 의해 제대로 처리하는 라는 이름의 함수 표현식을 사용

io.sockets.on('connection', function handleConnection(socket) { 
    socket.on('action1', function (data) { 
     // logic for action1 
    }); 

    socket.on('action2', function (data) { 
     // logic for action2 
    }); 

    socket.on('disconnect', function(){ 
     // logic for disconnect 
    }); 
}); 

: 당신의 예에서 함수는 이름을 가질 수 있습니다. (슬프게도, 그것은 not handled correctly by IE8 and earlier입니다. 완전히 다른 시간대에 완전히 다른 두 가지 기능을 생성합니다.하지만 V8을 사용하면 걱정할 필요가 없습니다.)