Я пытаюсь создать глобальную функцию, где я могу использовать ее в любом месте внутри файла .js
.Создать глобальную функцию в JavaScript
У нас есть более 50 файлов javascript, соединенных вместе и внутри каждого файла. Я хочу иметь возможность использовать эту библиотеку где угодно.
Localized.js
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(factory);
} else if (typeof exports === 'object') {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like enviroments that support module.exports,
// like Node.
module.exports = factory();
} else {
// Browser globals (root is window)
if (typeof Localized !== 'undefined') {
throw 'Localized" already in use';
}
root.Localized = factory();
}
}(this, function() {
var _strings,
_readyCallback,
_isReady = false,
_requestedStrings = false;
function ready(data) {
_readyCallback = _readyCallback || function(){};
function domReady() {
// If the DOM isn't ready yet, repeat when it is
if (document.readyState !== "complete") {
document.onreadystatechange = domReady;
return;
}
document.onreadystatechange = null;
_strings = data;
_isReady = true;
_readyCallback();
}
domReady();
}
// Get the current lang from the document's HTML element, which the
// server set when the page was first rendered. This saves us having
// to pass extra locale info around on the URL.
function getCurrentLang() {
var html = document.querySelector("html");
return html && html.lang ? html.lang : "en-US";
}
var Localized = {
get: function(key) {
if (!_strings) {
console.error("[goggles.webmaker.org] Error: string catalog not found.");
return "";
}
return (_strings[ key ] || "");
},
getCurrentLang: getCurrentLang,
// Localized strings are ready
ready: function(cb) {
if (!_requestedStrings) {
_requestedStrings = true;
_readyCallback = cb;
function onload(data) {
ready(data);
}
onload.error = console.log;
var xhr = new XMLHttpRequest();
xhr.open('GET', '/strings/' + getCurrentLang() + '?bust=' + Date.now(), false);
xhr.send(null);
if (xhr.status !== 200) {
err = new Error(id + ' HTTP status: ' + status);
err.xhr = xhr;
onload.error(err);
return;
}
onload(JSON.parse(xhr.responseText));
};
if (_isReady) {
_readyCallback();
}
},
isReady: function() {
return !!_isReady;
}
};
return Localized;
}));
Так что я хочу, чтобы иметь возможность перейти в любой из файлов и сделать Localized.get("something");
Но тогда я даже не имею Localized
объекта доступного в сетей консоль. Например, если у вас есть jQuery
, вы можете сделать $
в веб-консоли, и вы можете что-то там сделать.
Внутри модуля сделать что-то вроде 'window.Localized = Localized' сделать модуль доступен по всему миру. –
Откуда вы это используете? Я ожидаю, что он будет глобальным из-за 'root.Localized = factory();'. Если это не так, то этот «этот» вы передаете не глобальный объект. Вы запускаете это изнутри другой функции, возможно, обработчик IIFE или document.ready? – bfavaretto
Вы упомянули, что хотите воспроизвести, как это делает jQuery, так почему бы вам не взглянуть на источник jQuery и не увидеть сами? Если я правильно помню, это похоже на то, что сказал Фрэнк – yuvi