Пространство имен окна JavaScript - могу ли я получить представление о том, что это делает, пожалуйста? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть код, который я пытаюсь понять.Я не специалист по JavaScript (у меня есть базовые знания), и я читал о DOM и пространстве имен (и console.log() с использованием переменных), чтобы попытаться понять, что это делает (к сожалению,безрезультатно).

Этот код далеко за пределами моего понимания, и я надеялся, что кто-то может "замять это" для меня с объяснением того, что он делает.

Это coffeescript (я поставлю JavaScript в конце):

((window) ->
    'use strict'
    window.__slice = [].slice
    namespace = (target, name, block) ->
        [target, name, block] = [window, arguments...] if arguments.length < 3
        top = target
        target = target[item] or= {} for item in name.split '.'
        block target, top
    namespace 'my_app', (exports, top) ->
        exports.namespace = namespace
)(window)

Я понимаю, что он управляет пространством имен и что это IIFE.Мои мысли об остальном (но очень неуверенно):

  1. window.__slice = [].slice - не знаю, для чего это предназначено.
  2. namespace = (target, name, block) -> - определяет функцию и ее параметры
  3. namespace 'my_app', (exports, top) -> - вызов функции namespace, с target='my_app'.Второй передаваемый параметр - это функция, которая, похоже, возвращает одну переменную (вместо двух, требуемых функцией namespace).Я не понимаю, почему это работает, если namespace определяет 3 параметра.Это имеет смысл, если namespace = (target='my_app', name='exports', block='top'), я просто не понимаю, как это происходит через return exports.namespace = namespace.

Если бы я мог понять, что делают 1 и 3, я думаю, что мог быразберитесь с остальным, но если бы вы могли дать некоторое представление о коде в целом, он был бы очень признателен.

JavaScript (преобразован с coffee2js ):

(function() {
  var __slice = [].slice;

  (function(window) {
    'use strict';
    var namespace;
    window.__slice = [].slice;
    namespace = function(target, name, block) {
      var item, top, _i, _len, _ref, _ref1;
      if (arguments.length < 3) {
        _ref = [window].concat(__slice.call(arguments)), target = _ref[0], name = _ref[1], block = _ref[2];
      }
      top = target;
      _ref1 = name.split('.');
      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
        item = _ref1[_i];
        target = target[item] || (target[item] = {});
      }
      return block(target, top);
    };
    return namespace('my_app', function(exports, top) {
      return exports.namespace = namespace;
    });
  })(window);

}).call(this);

1 Ответ

0 голосов
/ 11 октября 2018

Я постараюсь ответить на 3 вопроса:

1.- Slice

slice () - это встроенный метод всехмассивы в JS.Он используется для копирования массива, получения нового массива, а не ссылки на исходный массив (в js массивы копируются по ссылке по умолчанию)

Строка window.__slice = [].slice создает новый метод вокно, называемое __slice, и его значение является копией собственного метода js slice.

Позже он используется здесь: __slice.call(arguments)

Ознакомьтесь с документами срезов

2.- Функции

namespace = (target, name, block) ->

Вы правы, это синтаксис coffeescript, и он выдаст обычную функцию и ее параметры.

3.- Функции и аргументы

Цитата: «Я не понимаю, почему это работает, если пространство имен определяет 3 параметра ....»

Все обычные функции (не функции стрелок) имеют встроенный объект с именем arguments.

Он используется здесь:

if (arguments.length < 3) {...}

Таким образом, вы можете проверить количествоаргументы вашей функции.

Проверьте аргументы документов

Наконец, по моему мнению, если вы не очень хорошо знакомы с javascript, вам следует попытаться изучить синтаксисВаниль JS, не Coffeescript.Кроме того, coffeescript используется меньше каждый день.

...