0

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

我在程序中使用的客户端代码非常简单——我只是链接到 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);
...
})();

似乎秘密就在“全局”参数中,但是,究竟是谁将“全局”发送给这个函数呢?(很难理解所有括号中的函数......)

4

1 回答 1

0

您正在寻找的模式是这样的:

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

thisreference 是执行此函数的范围(此模式既定义了函数又执行了它),恰好是全局范围。有关 javascript 范围的更多信息,请参见此处 - http://tore.darell.no/pages/scope_in_javascript

于 2013-01-07T07:06:06.457 回答