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

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

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

Это сценарий (я поставлю 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 ответ

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

1.- Срез

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, вы должны попытаться изучить синтаксис vanilla js, а не coffeescript. Кроме того, coffeescript используется меньше каждый день.

Другие вопросы по тегам