У меня есть код, который я пытаюсь понять.Я не специалист по 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.Мои мысли об остальном (но очень неуверенно):
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);