2013-08-16 4 views
2

Я пытаюсь создать глобальную функцию, где я могу использовать ее в любом месте внутри файла .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, вы можете сделать $ в веб-консоли, и вы можете что-то там сделать.

+1

Внутри модуля сделать что-то вроде 'window.Localized = Localized' сделать модуль доступен по всему миру. –

+1

Откуда вы это используете? Я ожидаю, что он будет глобальным из-за 'root.Localized = factory();'. Если это не так, то этот «этот» вы передаете не глобальный объект. Вы запускаете это изнутри другой функции, возможно, обработчик IIFE или document.ready? – bfavaretto

+0

Вы упомянули, что хотите воспроизвести, как это делает jQuery, так почему бы вам не взглянуть на источник jQuery и не увидеть сами? Если я правильно помню, это похоже на то, что сказал Фрэнк – yuvi

ответ

0

Так получается, что мой Javascript глобально определены и доступны везде в файл, который включается и может быть позвонить из консоли, а кроме меня инициализировать что делать Localized.ready(function(){}); тогда я могу получить это работать.

Так что, если кто-то хочет создать свою собственную глобальную функцию и сделать ее стандартной, они могут следовать этому пути.

amdWeb.js это то, что я использую в качестве стандарта для создания глобальной функции.

1

Вы когда-нибудь смотрели глобальную функцию Three.js? Это очень легко понять!

(function (global, factory) { 
 
\t typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : 
 
\t typeof define === 'function' && define.amd ? define(['exports'], factory) : 
 
\t (factory((global.THREE = global.THREE || {}))); 
 
}(this, (function (exports) { 'use strict';

Смежные вопросы