2014-08-30 80 views
0

我已經有一些Node.js在jQuery的文檔中準備了一些函數。我有兩個文件都準備好了文件。但是,一個文件調用另一個文件,並且它不識別該功能。 ReferenceError:SocketGameOut未定義Javascript/JQuery範圍問題

=========== File 1 ============= 

$(document).ready(function() { 

var socket = io.connect('http://local.baseball.com:3333'); 

socket.on('news', function (data) { 
    SocketBroadcastIn(data); 
}); 

socket.on('message', function (data) { 
    SocketGameIn(data); 
}); 

function SocketGameOut(outstring) { 
    socket.emit('clientData', outstring); 
} 

}); 

============ File 2 ============== 

$(document).ready(function() { 

    $("#login").click(function() { 

    var loginData = { command: 'login', user: $("#user").val(), pass: $("#password").val() } 
    var data = JSON.stringify(loginData); 

    SocketGameOut(data); <--This function call returns 
       ReferenceError: SocketGameOut is not defined 

}); 

}); 
+0

最簡單的辦法會是使SocketGameOut成爲全局的。例如,在file1中,在'document.ready'中的最後一個東西,放置'window.SocketGameOut = SocketGameOut'。 – 2014-08-30 20:27:49

回答

1

函數遵循與變量相同的作用域規則(實際上函數是變量)。所以如果你在另一個函數中創建一個函數,它將只在該函數中可見。

在第一個文件中,您不需要$(document).ready事件,因爲您不操作DOM。只需將其刪除並在全局範圍內創建變量即可,因此它們將在文件1的其他部分以及所有文件中都可見,包括在本文後。

另一種方法是此功能附加到一個變量$(document).ready外面,所以這將是在全球範圍內,但沒有必要在這裏和第一種方式會更好:

var SocketGameOut; 
$(document).ready(function() { 
    //your code... 
    SocketGameOut = function (outstring) { 
     socket.emit('clientData', outstring); 
    } 
    //your code... 
}); 
+0

+1,簡潔的答案。 – 2014-08-30 20:30:07

+0

謝謝,像一個魅力工作! – 2014-08-30 20:31:35