[javascript] node.js 전역 변수?

나는 여기에 물었다 :
node.js는 상속이 필요합니까?

var를 생략하여 변수를 전역 범위로 설정할 수 있다고 들었습니다.

이것은 나를 위해 작동하지 않습니다.

즉 :

_ = require('underscore');

필수 파일에서 _을 사용할 수 없습니다. Express로 설정하고 app.set다른 곳에서도 사용할 수 있습니다.

누군가 이것이 작동해야한다고 확인할 수 있습니까? 감사.



답변

다음 global과 같이 사용할 수 있습니다 .

global._ = require('underscore')


답변

노드에서 “global”또는 “GLOBAL”오브젝트를 통해 글로벌 변수를 설정할 수 있습니다.

GLOBAL._ = require('underscore'); // but you "shouldn't" do this! (see note below)

더 유용하게 …

GLOBAL.window = GLOBAL;  // like in the browser

노드 소스에서 이들이 서로 별명임을 알 수 있습니다.

node-v0.6.6/src/node.js:
28:     global = this;
128:    global.GLOBAL = global;

위의 코드에서 “this”는 전역 컨텍스트입니다. 공통 JS 모듈 시스템 (노드가 사용하는)에서 모듈 내부의 “this”객체 (예 : “your code”)는 전역 컨텍스트가 아닙니다. 이를 증명하기 위해 아래에서 “this”객체를 뿜어 낸 다음 거대한 “GLOBAL”객체를 뿜어 낸 곳을 아래에서 확인하십시오.

console.log("\nTHIS:");
console.log(this);
console.log("\nGLOBAL:");
console.log(global);

/* outputs ...

THIS:
{}

GLOBAL:
{ ArrayBuffer: [Function: ArrayBuffer],
  Int8Array: { [Function] BYTES_PER_ELEMENT: 1 },
  Uint8Array: { [Function] BYTES_PER_ELEMENT: 1 },
  Int16Array: { [Function] BYTES_PER_ELEMENT: 2 },
  Uint16Array: { [Function] BYTES_PER_ELEMENT: 2 },
  Int32Array: { [Function] BYTES_PER_ELEMENT: 4 },
  Uint32Array: { [Function] BYTES_PER_ELEMENT: 4 },
  Float32Array: { [Function] BYTES_PER_ELEMENT: 4 },
  Float64Array: { [Function] BYTES_PER_ELEMENT: 8 },
  DataView: [Function: DataView],
  global: [Circular],
  process: 
   { EventEmitter: [Function: EventEmitter],
     title: 'node',
     assert: [Function],
     version: 'v0.6.5',
     _tickCallback: [Function],
     moduleLoadList: 
      [ 'Binding evals',
        'Binding natives',
        'NativeModule events',
        'NativeModule buffer',
        'Binding buffer',
        'NativeModule assert',
        'NativeModule util',
        'NativeModule path',
        'NativeModule module',
        'NativeModule fs',
        'Binding fs',
        'Binding constants',
        'NativeModule stream',
        'NativeModule console',
        'Binding tty_wrap',
        'NativeModule tty',
        'NativeModule net',
        'NativeModule timers',
        'Binding timer_wrap',
        'NativeModule _linklist' ],
     versions: 
      { node: '0.6.5',
        v8: '3.6.6.11',
        ares: '1.7.5-DEV',
        uv: '0.6',
        openssl: '0.9.8n' },
     nextTick: [Function],
     stdout: [Getter],
     arch: 'x64',
     stderr: [Getter],
     platform: 'darwin',
     argv: [ 'node', '/workspace/zd/zgap/darwin-js/index.js' ],
     stdin: [Getter],
     env: 
      { TERM_PROGRAM: 'iTerm.app',
        'COM_GOOGLE_CHROME_FRAMEWORK_SERVICE_PROCESS/USERS/DDOPSON/LIBRARY/APPLICATION_SUPPORT/GOOGLE/CHROME_SOCKET': '/tmp/launch-nNl1vo/ServiceProcessSocket',
        TERM: 'xterm',
        SHELL: '/bin/bash',
        TMPDIR: '/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/',
        Apple_PubSub_Socket_Render: '/tmp/launch-9Ga0PT/Render',
        USER: 'ddopson',
        COMMAND_MODE: 'unix2003',
        SSH_AUTH_SOCK: '/tmp/launch-sD905b/Listeners',
        __CF_USER_TEXT_ENCODING: '0x12D732E7:0:0',
        PATH: '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/X11/bin',
        PWD: '/workspace/zd/zgap/darwin-js',
        LANG: 'en_US.UTF-8',
        ITERM_PROFILE: 'Default',
        SHLVL: '1',
        COLORFGBG: '7;0',
        HOME: '/Users/ddopson',
        ITERM_SESSION_ID: 'w0t0p0',
        LOGNAME: 'ddopson',
        DISPLAY: '/tmp/launch-l9RQXI/org.x:0',
        OLDPWD: '/workspace/zd/zgap/darwin-js/external',
        _: './index.js' },
     openStdin: [Function],
     exit: [Function],
     pid: 10321,
     features: 
      { debug: false,
        uv: true,
        ipv6: true,
        tls_npn: false,
        tls_sni: true,
        tls: true },
     kill: [Function],
     execPath: '/usr/local/bin/node',
     addListener: [Function],
     _needTickCallback: [Function],
     on: [Function],
     removeListener: [Function],
     reallyExit: [Function],
     chdir: [Function],
     debug: [Function],
     error: [Function],
     cwd: [Function],
     watchFile: [Function],
     umask: [Function],
     getuid: [Function],
     unwatchFile: [Function],
     mixin: [Function],
     setuid: [Function],
     setgid: [Function],
     createChildProcess: [Function],
     getgid: [Function],
     inherits: [Function],
     _kill: [Function],
     _byteLength: [Function],
     mainModule: 
      { id: '.',
        exports: {},
        parent: null,
        filename: '/workspace/zd/zgap/darwin-js/index.js',
        loaded: false,
        exited: false,
        children: [],
        paths: [Object] },
     _debugProcess: [Function],
     dlopen: [Function],
     uptime: [Function],
     memoryUsage: [Function],
     uvCounters: [Function],
     binding: [Function] },
  GLOBAL: [Circular],
  root: [Circular],
  Buffer: 
   { [Function: Buffer]
     poolSize: 8192,
     isBuffer: [Function: isBuffer],
     byteLength: [Function],
     _charsWritten: 8 },
  setTimeout: [Function],
  setInterval: [Function],
  clearTimeout: [Function],
  clearInterval: [Function],
  console: [Getter],
  window: [Circular],
  navigator: {} }
*/

** 참고 : “GLOBAL._”설정과 관련하여 일반적으로 수행해야 var _ = require('underscore');합니다. 예, Java에서와 마찬가지로 밑줄을 사용하는 모든 단일 파일 에서이 작업을 수행 import com.foo.bar;합니다. 이렇게하면 파일 간의 연결이 ‘명시 적’이므로 코드가 수행중인 작업을 쉽게 파악할 수 있습니다. 약간 성가 시지만 좋은 일입니다. …. 설교입니다.

모든 규칙에는 예외가 있습니다. “GLOBAL._”을 설정해야하는 정확히 하나의 인스턴스가 있습니다. 기본적으로 JSON 인 “config”파일을 정의하는 시스템을 만들고 있었지만 좀 더 융통성있게하기 위해 “JS로 작성”되었습니다. 이러한 구성 파일에는 ‘필수’문이 없었지만 밑줄 (ENTIRE 시스템은 밑줄 및 밑줄 템플릿로 표시됨)에 액세스하기를 원했기 때문에 “config”를 평가하기 전에 “GLOBAL._”을 설정했습니다. 예, 모든 규칙에 어딘가에 예외가 있습니다. 그러나 당신은 타당한 이유가 있고 “나는 ‘필수’를 입력하는 데 지쳐서 컨벤션을 깨고 싶다.”


답변

GLOBAL 키워드를 사용하는 다른 솔루션은 프로젝트가 커질 때 유지 / 가독성 (+ 네임 스페이스 오염 및 버그)에 대한 악몽입니다. 나는이 실수를 여러 번 보았고 그것을 고치는 번거 로움이 있었다.

JS 파일을 사용한 다음 모듈 내보내기를 사용하십시오.

예:

globals.js

var Globals = {
    'domain':'www.MrGlobal.com';
}

module.exports = Globals;

그런 다음이를 사용하려면 require를 사용하십시오.

var globals = require('globals'); //<< globals.js path
globals.domain //<< Domain.


답변

글로벌 네임 스페이스는 어떻습니까? global.MYAPI = {}

global.MYAPI._ = require('underscore')

camilo-martin의 의견 후 편집 : 다른 모든 포스터는 관련된 나쁜 패턴에 대해 이야기합니다. 따라서 논의를 제쳐두고 변수를 전역 적으로 정의하는 가장 좋은 방법은 네임 스페이스를 사용하는 것입니다.

@ 팁 : http://thanpol.as/javascript/development-using-namespaces


답변

전역 객체 만 사용할 수 있습니다.

var X = ['a', 'b', 'c'];
global.x = X;

console.log(x);
//['a', 'b', 'c']


답변

글로벌을 설정하기 위해 global / GLOBAL 네임 스페이스를 사용하는 것은 나쁜 습관이며 이론 상으로는 ( 이론적 으로 작동 단어 임) 전혀 사용하지 않는다는 데 동의합니다 . 그러나 (예, 요원) 사용자 정의 오류 클래스를 설정하는 데 사용합니다.

// Some global/config file that gets called in initialisation

global.MyError = [Function of MyError];

예, 금기 사항이지만 사이트 / 프로젝트가 전체에서 사용자 정의 오류를 사용하는 경우 기본적으로 어디서나 정의하거나 다음과 같이 어딘가에 정의해야합니다.

  1. 먼저 오류 클래스를 정의하십시오.
  2. 던지는 스크립트에서
  3. 당신이 그것을 잡는 스크립트에서

전역 네임 스페이스에서 사용자 지정 오류를 정의하면 고객 오류 라이브러리를 필요로하지 않아도됩니다. 해당 사용자 정의 오류가 정의되지 않은 경우 사용자 정의 오류가 발생하는 이미징.

또한, 이것이 잘못되면 최근에 방금 시작한 것으로 알려주세요.


답변