Understanding socket.io.js

Understanding socket.io.js

本文关键字:js io socket Understanding      更新时间:2023-09-26

我试图了解socket的Javascript客户端代码。io的作品。具体来说,我的目标是理解,它是如何知道服务器的位置的?

我在程序中使用的客户端代码非常简单-我只链接到socket.io.js:

<script src="./socket.io/socket.io.js"></script>

然后:

var socket = io.connect()

就是这样-套接字自动连接到服务器。但是它是怎么知道的呢?

我看了看socket.io.js,这是我发现的(注释修剪):

var io = ('undefined' === typeof module ? {} : module.exports);
(function() {
/** Copyright(c) 2011 LearnBoost <dev@learnboost.com> * MIT Licensed */
(function (exports, global) {
  var io = exports;
  io.version = '0.9.11';
  io.protocol = 1;
  io.transports = [];
  io.j = [];
  io.sockets = {};

  /**
   * Manages connections to hosts.
   * @param {String} uri
   * @Param {Boolean} force creation of new socket (defaults to false)
   * @api public
   */
  io.connect = function (host, details) {
    var uri = io.util.parseUri(host)
      , uuri
      , socket;
    if (global && global.location) {
      uri.protocol = uri.protocol || global.location.protocol.slice(0, -1);
      uri.host = uri.host || (global.document
        ? global.document.domain : global.location.hostname);
      uri.port = uri.port || global.location.port;
    }
    uuri = io.util.uniqueUri(uri);
    ... 
})('object' === typeof module ? module.exports : (this.io = {}), this);
...
})();

似乎秘密是在"全局"参数,但是,究竟是谁发送"全局"到这个函数?

您要查找的模式是:

(function (exports,global) {
   ///content
}) (<whatever>, this);

this引用是执行该函数的作用域(此模式既定义函数又执行函数),它恰好是全局作用域。有关javascript作用域的更多信息,请参阅这里- http://tore.darell.no/pages/scope_in_javascript