Пространство имен окна 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. Мои мысли об отдыхе (но очень неуверенные):
window.__slice = [].slice
- понятия не имею, что это значит.namespace = (target, name, block) ->
- определяет функцию и ее параметры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 используется меньше каждый день.