Apa 'global' objek di NodeJS

I've hanya melihat perilaku aneh dari ini kata kunci di NodeJS lingkungan. I'm listing mereka dengan kode. I've menjalankan kode ini dengan NodeJS v6.x, dengan single JavaScript file.

Sementara pengujian dengan satu baris kode sebagai berikut, apakah dengan atau tanpa 'penggunaan ketat' pernyataan ini menunjuk ke objek kosong {}.

console.log(this)

Tapi, ketika saya'm menjalankan pernyataan dalam melaksanakan fungsi seperti,

(function(){
  console.log(this);
}());

It's percetakan yang benar-benar besar objek. Menurut saya Global eksekusi konteks objek yang dibuat oleh NodeJS lingkungan.

Dan saat menjalankan fungsi di atas dengan 'penggunaan ketat' pernyataan, diharapkan it's printing undefined

(function(){
  'use strict';

  console.log(this);
}());

Tapi, saat bekerja dengan browser (saya've diuji hanya dengan Chrome), tiga contoh hasil jendela objek dan yang terakhir memberi undefined seperti yang diharapkan.

Perilaku dari browser ini cukup dimengerti. Tapi, dalam kasus Indonesia, apakah itu tidak membuat konteks eksekusi, sampai aku'm pembungkus di dalam fungsi?

Jadi, sebagian besar dari kode di Indonesia berjalan dengan kosong global objek?

Mengomentari pertanyaan (1)
Larutan

Sementara di browser lingkup global adalah jendela objek, di nodeJS global lingkup modul modul itu sendiri, sehingga ketika anda mendefinisikan variabel dalam lingkup global dari nodeJS modul, ini akan menjadi lokal untuk modul ini.

Anda dapat membaca lebih lanjut tentang hal itu di NodeJS dokumentasi di mana ia mengatakan:

global

<Objek> global namespace objek.

Di browser, top-level lingkup lingkup global. Itu berarti bahwa di browser jika anda're dalam lingkup global var sesuatu yang akan menentukan variabel global. Di Node.js ini adalah berbeda. Top-level lingkup tidak dalam lingkup global; var sesuatu di dalam Node.js modul akan lokal untuk modul tersebut.

Dan dalam kode anda ketika anda menulis:

  • konsol.log(ini) kosong js file(modul) akan mencetak objek kosong {} mengacu anda kosong modul.
  • konsol.log(ini); di dalam diri menjalankan fungsi, ini akan mengarah ke global nodeJS lingkup objek yang berisi semua NodeJS sifat-sifat umum dan metode seperti require(), modul, ekspor, console...
  • konsol.log(ini) dengan strict mode di dalam diri memanggil fungsi ini akan mencetak undefined sebagai self dipanggil fungsi doesn't memiliki default lokal lingkup objek di Strict mode.
Komentar (0)

Nilai ini di node modul:

ini di NodeJS lingkup global adalah modul saat ini.ekspor objek, bukan objek global. Hal ini berbeda dari browser mana lingkup global adalah global jendela objek. Pertimbangkan hal berikut kode yang dijalankan di Node:

console.log(this);    // logs {}

module.exports.foo = 5;

console.log(this);   // log { foo:5 }

Pertama kita log emty objek karena tidak ada nilai di modul.ekspor dalam modul ini. Kemudian kita menempatkan foo pada modul.ekspor objek, ketika kita kemudian lagi log ini kita dapat melihat bahwa sekarang log diperbarui modul.ekspor objek.

Bagaimana kita dapat mengakses global objek:

Kita dapat mengakses global objek di node menggunakan global kata kunci:

console.log(global);

The global objek memperlihatkan berbagai sifat yang berguna tentang lingkungan. Juga ini adalah tempat di mana fungsi sebagai setImmediate dan clearTimeout berada.

Komentar (1)

Sangat menarik:

var JSON = require('circular-json');

console.log('1) ' + JSON.stringify(this, null, 2));

(function(){
    console.log('2) ' + JSON.stringify(this, null, 2));
}());

(function(){
  'use strict';
   console.log('3) ' + JSON.stringify(this, null, 2));
}());

akan menghasilkan:

1) {}

2) {
  "global": "~",
  "process": {
    "title": "node",
    "version": "v6.9.1",
    "moduleLoadList": [
      "Binding contextify",
      "Binding natives",
      "NativeModule events",
      "NativeModule util",
      "Binding uv",
      "NativeModule buffer",
      "Binding buffer",
      "Binding util",
      "NativeModule internal/util",
      "NativeModule timers",
      "Binding timer_wrap",
      "NativeModule internal/linkedlist",
      "NativeModule assert",
      "NativeModule internal/process",
      "Binding config",
      "NativeModule internal/process/warning",
      "NativeModule internal/process/next_tick",
      "NativeModule internal/process/promises",                                                                                                              
      "NativeModule internal/process/stdio",                                                                                                                 
      "Binding constants",                                                                                                                                   
      "NativeModule path",                                                                                                                                   
      "NativeModule module",                                                                                                                                 
      "NativeModule internal/module",                                                                                                                        
      "NativeModule vm",                                                                                                                                     
      "NativeModule fs",                                                                                                                                     
      "Binding fs",                                                                                                                                          
      "NativeModule stream",                                                                                                                                 
      "NativeModule _stream_readable",                                                                                                                       
      "NativeModule internal/streams/BufferList",                                                                                                            
      "NativeModule _stream_writable",                                                                                                                       
      "NativeModule _stream_duplex",                                                                                                                         
      "NativeModule _stream_transform",                                                                                                                      
      "NativeModule _stream_passthrough",                                                                                                                    
      "Binding fs_event_wrap",                                                                                                                               
      "NativeModule console",                                                                                                                                
      "Binding tty_wrap",                                                                                                                                    
      "NativeModule tty",                                                                                                                                    
      "NativeModule net",                                                                                                                                    
      "NativeModule internal/net",                                                                                                                           
      "Binding cares_wrap",                                                                                                                                  
      "Binding tcp_wrap",                                                                                                                                    
      "Binding pipe_wrap",                                                                                                                                   
      "Binding stream_wrap",                                                                                                                                 
      "Binding signal_wrap"                                                                                                                                  
    ],                                                                                                                                                       
    "versions": {                                                                                                                                            
      "http_parser": "2.7.0",                                                                                                                                
      "node": "6.9.1",                                                                                                                                       
      "v8": "5.1.281.84",                                                                                                                                    
      "uv": "1.9.1",                                                                                                                                         
      "zlib": "1.2.8",                                                                                                                                       
      "ares": "1.10.1-DEV",                                                                                                                                  
      "icu": "57.1",                                                                                                                                         
      "modules": "48",                                                                                                                                       
      "openssl": "1.0.2j"                                                                                                                                    
    },                                                                                                                                                       
    "arch": "x64",                                                                                                                                           
    "platform": "linux",                                                                                                                                     
    "release": {                                                                                                                                             
      "name": "node",                                                                                                                                        
      "lts": "Boron",                                                                                                                                        
      "sourceUrl": "https://nodejs.org/download/release/v6.9.1/node-v6.9.1.tar.gz",
      "headersUrl": "https://nodejs.org/download/release/v6.9.1/node-v6.9.1-headers.tar.gz"
    },
    "argv": [
      "/usr/local/bin/node",
      "/home/froth/freelancer-projects/thistest.js"
    ],
    "execArgv": [],
    "env": {
      "NVM_DIR": "/home/froth/.nvm",
      "LD_LIBRARY_PATH": "/opt/opencascade/lib",
      "CSF_UnitsDefinition": "/opt/opencascade/src/UnitsAPI/Units.dat",
      "CSF_GraphicShr": "/opt/opencascade/lib/libTKOpenGl.so",
      "CSF_EXCEPTION_PROMPT": "1",
      "LANG": "de_DE.UTF-8",
      "PROFILEHOME": "",
      "DISPLAY": ":0",
      "SHELL_SESSION_ID": "09b6f0f3b1d94c5f8aba3f8022075677",
      "NODE_PATH": "/usr/lib/node_modules",
      "COLORTERM": "truecolor",
      "NVM_CD_FLAGS": "",
      "MOZ_PLUGIN_PATH": "/usr/lib/mozilla/plugins",
      "CSF_IGESDefaults": "/opt/opencascade/src/XSTEPResource",
      "CSF_XCAFDefaults": "/opt/opencascade/src/StdResource",
      "XDG_VTNR": "1",
      "PAM_KWALLET5_LOGIN": "/tmp/kwallet5_froth.socket",
      "CSF_STEPDefaults": "/opt/opencascade/src/XSTEPResource",
      "XDG_SESSION_ID": "c2",
      "CSF_XSMessage": "/opt/opencascade/src/XSMessage",
      "USER": "froth",
      "DESKTOP_SESSION": "/usr/share/xsessions/awesome",
      "GTK2_RC_FILES": "/home/froth/.gtkrc-2.0",
      "PWD": "/home/froth/freelancer-projects",
      "HOME": "/home/froth",
      "XDG_SESSION_TYPE": "x11",
      "CSF_PluginDefaults": "/opt/opencascade/src/StdResource",
      "XDG_DATA_DIRS": "/usr/local/share/:/usr/share/:/var/lib/snapd/desktop",
      "NVM_IOJS_ORG_MIRROR": "https://iojs.org/dist",
      "KONSOLE_DBUS_SESSION": "/Sessions/1",
      "XDG_SESSION_DESKTOP": "",
      "CSF_StandardDefaults": "/opt/opencascade/src/StdResource",
      "CSF_StandardLiteDefaults": "/opt/opencascade/src/StdResource",
      "MMGT_CLEAR": "1",
      "KONSOLE_DBUS_WINDOW": "/Windows/1",
      "CSF_UnitsLexicon": "/opt/opencascade/src/UnitsAPI/Lexi_Expr.dat",
      "GTK_MODULES": "canberra-gtk-module",
      "MAIL": "/var/spool/mail/froth",
      "NVM_RC_VERSION": "",
      "CSF_XmlOcafResource": "/opt/opencascade/src/XmlOcafResource",
      "TERM": "xterm-256color",
      "SHELL": "/bin/bash",
      "KONSOLE_DBUS_SERVICE": ":1.23",
      "XDG_SESSION_CLASS": "user",
      "XDG_SEAT_PATH": "/org/freedesktop/DisplayManager/Seat0",
      "XDG_CURRENT_DESKTOP": "",
      "QT_LINUX_ACCESSIBILITY_ALWAYS_ON": "1",
      "KONSOLE_PROFILE_NAME": "Shell",
      "CASROOT": "/opt/opencascade",
      "NVM_NODEJS_ORG_MIRROR": "https://nodejs.org/dist",
      "COLORFGBG": "15;0",
      "XDG_SEAT": "seat0",
      "SHLVL": "2",
      "LANGUAGE": "",
      "WINDOWID": "29360134",
      "LOGNAME": "froth",
      "DBUS_SESSION_BUS_ADDRESS": "unix:path=/run/user/1000/bus",
      "XDG_RUNTIME_DIR": "/run/user/1000",
      "CSF_MDTVTexturesDirectory": "/opt/opencascade/src/Textures",
      "XAUTHORITY": "/home/froth/.Xauthority",
      "XDG_SESSION_PATH": "/org/freedesktop/DisplayManager/Session1",
      "PATH": "/home/froth/.gem/ruby/2.3.0/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/snap/bin:/usr/lib/jvm/default/bin:/opt/opencascade/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl",
      "CSF_LANGUAGE": "us",
      "CSF_SHMessage": "/opt/opencascade/src/SHMessage",
      "OLDPWD": "/home/froth",
      "_": "/usr/local/bin/node"
    },
    "pid": 4658,
    "features": {
      "debug": false,
      "uv": true,
      "ipv6": true,
      "tls_npn": true,
      "tls_alpn": true,
      "tls_sni": true,
      "tls_ocsp": true,
      "tls": true
    },
    "_needImmediateCallback": false,
    "execPath": "/usr/local/bin/node",
    "debugPort": 5858,
    "_events": {
      "SIGWINCH": [
        null,
        null
      ]
    },
    "_eventsCount": 4,
    "domain": null,
    "_exiting": false,
    "config": {
      "target_defaults": {
        "cflags": [],
        "default_configuration": "Release",
        "defines": [],
        "include_dirs": [],
        "libraries": []
      },
      "variables": {
        "asan": 0,
        "debug_devtools": "node",
        "force_dynamic_crt": 0,
        "gas_version": "2.23",
        "host_arch": "x64",
        "icu_data_file": "icudt57l.dat",
        "icu_data_in": "../../deps/icu-small/source/data/in/icudt57l.dat",
        "icu_endianness": "l",
        "icu_gyp_path": "tools/icu/icu-generic.gyp",
        "icu_locales": "en,root",
        "icu_path": "deps/icu-small",
        "icu_small": true,
        "icu_ver_major": "57",
        "node_byteorder": "little",
        "node_enable_d8": false,
        "node_enable_v8_vtunejit": false,
        "node_install_npm": true,
        "node_module_version": 48,
        "node_no_browser_globals": false,
        "node_prefix": "/",
        "node_release_urlbase": "https://nodejs.org/download/release/",
        "node_shared": false,
        "node_shared_cares": false,
        "node_shared_http_parser": false,
        "node_shared_libuv": false,
        "node_shared_openssl": false,
        "node_shared_zlib": false,
        "node_tag": "",
        "node_use_bundled_v8": true,
        "node_use_dtrace": false,
        "node_use_etw": false,
        "node_use_lttng": false,
        "node_use_openssl": true,
        "node_use_perfctr": false,
        "node_use_v8_platform": true,
        "openssl_fips": "",
        "openssl_no_asm": 0,
        "shlib_suffix": "so.48",
        "target_arch": "x64",
        "uv_parent_path": "/deps/uv/",
        "uv_use_dtrace": false,
        "v8_enable_gdbjit": 0,
        "v8_enable_i18n_support": 1,
        "v8_inspector": true,
        "v8_no_strict_aliasing": 1,
        "v8_optimized_debug": 0,
        "v8_random_seed": 0,
        "v8_use_snapshot": true,
        "want_separate_host_toolset": 0
      }
    },
    "stdout": {
      "connecting": false,
      "_hadError": false,
      "_handle": {
        "bytesRead": 0,
        "_externalStream": {},
        "fd": 9,
        "writeQueueSize": 0,
        "owner": "~process~stdout"
      },
      "_parent": null,
      "_host": null,
      "_readableState": {
        "objectMode": false,
        "highWaterMark": 16384,
        "buffer": {
          "head": null,
          "tail": null,
          "length": 0
        },
        "length": 0,
        "pipes": null,
        "pipesCount": 0,
        "flowing": null,
        "ended": false,
        "endEmitted": false,
        "reading": false,
        "sync": true,
        "needReadable": false,
        "emittedReadable": false,
        "readableListening": false,
        "resumeScheduled": false,
        "defaultEncoding": "utf8",
        "ranOut": false,
        "awaitDrain": 0,
        "readingMore": false,
        "decoder": null,
        "encoding": null
      },
      "readable": false,
      "domain": null,
      "_events": {},
      "_eventsCount": 3,
      "_writableState": {
        "objectMode": false,
        "highWaterMark": 16384,
        "needDrain": false,
        "ending": false,
        "ended": false,
        "finished": false,
        "decodeStrings": false,
        "defaultEncoding": "utf8",
        "length": 0,
        "writing": false,
        "corked": 0,
        "sync": false,
        "bufferProcessing": false,
        "writecb": null,
        "writelen": 0,
        "bufferedRequest": null,
        "lastBufferedRequest": null,
        "pendingcb": 1,
        "prefinished": false,
        "errorEmitted": false,
        "bufferedRequestCount": 0,
        "corkedRequestsFree": {
          "next": null,
          "entry": null
        }
      },
      "writable": true,
      "allowHalfOpen": false,
      "destroyed": false,
      "_bytesDispatched": 6,
      "_sockname": null,
      "_writev": null,
      "_pendingData": null,
      "_pendingEncoding": "",
      "server": null,
      "_server": null,
      "columns": 84,
      "rows": 84,
      "_type": "tty",
      "fd": 1,
      "_isStdio": true
    },
    "stderr": {
      "connecting": false,
      "_hadError": false,
      "_handle": {
        "bytesRead": 0,
        "_externalStream": {},
        "fd": 11,
        "writeQueueSize": 0,
        "owner": "~process~stderr"
      },
      "_parent": null,
      "_host": null,
      "_readableState": {
        "objectMode": false,
        "highWaterMark": 16384,
        "buffer": {
          "head": null,
          "tail": null,
          "length": 0
        },
        "length": 0,
        "pipes": null,
        "pipesCount": 0,
        "flowing": null,
        "ended": false,
        "endEmitted": false,
        "reading": false,
        "sync": true,
        "needReadable": false,
        "emittedReadable": false,
        "readableListening": false,
        "resumeScheduled": false,
        "defaultEncoding": "utf8",
        "ranOut": false,
        "awaitDrain": 0,
        "readingMore": false,
        "decoder": null,
        "encoding": null
      },
      "readable": false,
      "domain": null,
      "_events": {},
      "_eventsCount": 3,
      "_writableState": {
        "objectMode": false,
        "highWaterMark": 16384,
        "needDrain": false,
        "ending": false,
        "ended": false,
        "finished": false,
        "decodeStrings": false,
        "defaultEncoding": "utf8",
        "length": 0,
        "writing": false,
        "corked": 0,
        "sync": true,
        "bufferProcessing": false,
        "writecb": null,
        "writelen": 0,
        "bufferedRequest": null,
        "lastBufferedRequest": null,
        "pendingcb": 0,
        "prefinished": false,
        "errorEmitted": false,
        "bufferedRequestCount": 0,
        "corkedRequestsFree": {
          "next": null,
          "entry": null
        }
      },
      "writable": true,
      "allowHalfOpen": false,
      "destroyed": false,
      "_bytesDispatched": 0,
      "_sockname": null,
      "_writev": null,
      "_pendingData": null,
      "_pendingEncoding": "",
      "server": null,
      "_server": null,
      "columns": 84,
      "rows": 84,
      "_type": "tty",
      "fd": 2,
      "_isStdio": true
    },
    "stdin": {
      "connecting": false,
      "_hadError": false,
      "_handle": {
        "bytesRead": 0,
        "_externalStream": {},
        "fd": 12,
        "writeQueueSize": 0,
        "owner": "~process~stdin",
        "reading": false
      },
      "_parent": null,
      "_host": null,
      "_readableState": {
        "objectMode": false,
        "highWaterMark": 0,
        "buffer": {
          "head": null,
          "tail": null,
          "length": 0
        },
        "length": 0,
        "pipes": null,
        "pipesCount": 0,
        "flowing": null,
        "ended": false,
        "endEmitted": false,
        "reading": false,
        "sync": false,
        "needReadable": true,
        "emittedReadable": false,
        "readableListening": false,
        "resumeScheduled": false,
        "defaultEncoding": "utf8",
        "ranOut": false,
        "awaitDrain": 0,
        "readingMore": false,
        "decoder": null,
        "encoding": null
      },
      "readable": true,
      "domain": null,
      "_events": {},
      "_eventsCount": 4,
      "_writableState": {
        "objectMode": false,
        "highWaterMark": 0,
        "needDrain": false,
        "ending": false,
        "ended": false,
        "finished": false,
        "decodeStrings": false,
        "defaultEncoding": "utf8",
        "length": 0,
        "writing": false,
        "corked": 0,
        "sync": true,
        "bufferProcessing": false,
        "writecb": null,
        "writelen": 0,
        "bufferedRequest": null,
        "lastBufferedRequest": null,
        "pendingcb": 0,
        "prefinished": false,
        "errorEmitted": false,
        "bufferedRequestCount": 0,
        "corkedRequestsFree": {
          "next": null,
          "entry": null
        }
      },
      "writable": false,
      "allowHalfOpen": false,
      "destroyed": false,
      "_bytesDispatched": 0,
      "_sockname": null,
      "_writev": null,
      "_pendingData": null,
      "_pendingEncoding": "",
      "server": null,
      "_server": null,
      "isRaw": false,
      "isTTY": true,
      "fd": 0
    },
    "argv0": "node",
    "mainModule": {
      "id": ".",
      "exports": {},
      "parent": null,
      "filename": "/home/froth/freelancer-projects/thistest.js",
      "loaded": false,
      "children": [
        {
          "id": "/home/froth/freelancer-projects/node_modules/circular-json/build/circular-json.node.js",
          "exports": {},
          "parent": "~process~mainModule",
          "filename": "/home/froth/freelancer-projects/node_modules/circular-json/build/circular-json.node.js",
          "loaded": true,
          "children": [],
          "paths": [
            "/home/froth/freelancer-projects/node_modules/circular-json/build/node_modules",
            "/home/froth/freelancer-projects/node_modules/circular-json/node_modules",
            "/home/froth/freelancer-projects/node_modules",
            "/home/froth/node_modules",
            "/home/node_modules",
            "/node_modules"
          ]
        }
      ],
      "paths": [
        "/home/froth/freelancer-projects/node_modules",
        "/home/froth/node_modules",
        "/home/node_modules",
        "/node_modules"
      ]
    }
  },
  "console": {}
}

3) undefined

Di 3) ini ini tidak terdefinisi karena tidak autoboxed ke objek ketat mode. Itu berarti bahwa tidak ada akar objek dalam konteks ini. Jika anda tidak menggunakan modus yang ketat maka kode anda kemas oleh orang tua lingkup.Seperti yang anda lihat pada output, dalam nodejs ada banyak informasi tentang node hal-hal internal.

Di 1) output adalah objek kosong karena di tingkat atas kode di node modul, ini adalah setara dengan modul.ekspor dan modul.ekspor kosong dalam contoh ini.

Komentar (0)

Untuk mulai dengan dokumentasi pada konteks Global di node lingkungan

Di browser, top-level lingkup lingkup global. Itu berarti bahwa di browser jika anda're dalam lingkup global var sesuatu yang akan mendefinisikan variabel global. Di Node.js ini adalah berbeda. Top-level lingkup bukan lingkup global; var sesuatu di dalam Node.js modul akan lokal untuk modul tersebut.

Masing-masing JS file diperlakukan sebagai suatu modul. Node secara otomatis membungkus kode JS file dalam diri HIDUP dengan ekspor, membutuhkan, modul, __nama __dirname sebagai parameter ke fungsi.

Di bawah ini adalah screenshot dari konteks eksekusi menggunakan node-debug

Jika anda menjalankan kode di bawah ini, cetakan benar yang berarti ini menunjuk pada ekspor di node.js. Terbaik dijelaskan dalam jawaban.

console.log(this === exports);

Yang berarti pada pelaksanaan kode dibungkus sesuatu yang mirip seperti di bawah ini Node.js memisahkan kode dari konteks global dengan menggunakan wrapper konteks fungsi.

  var context = (function (exports, require, module, __filename, __dirname) {
       console.log(this) //This is my code
  });

  var module = {exports:{}};
   context.apply(module.exports, [module.exports, require, module, "FILE_NAME", "DIR_NAME"]);

Jawaban ke titik berikutnya lihat ini dokumentasi benar-benar:

fungsi's ini kata kunci berperilaku sedikit berbeda dalam JavaScript dibandingkan dengan bahasa-bahasa lain. Ini juga memiliki beberapa perbedaan antara modus yang ketat dan non-strict mode.

jadi, ketika anda menjalankan kode ini

(function(){
  console.log(this);
}());

cetakan global objek dan dalam penggunaan ketatmode cetakanundefined`


Ingat:

Di Browser fungsi ini tidak dibungkus oleh HIDUP/pembungkus fungsi konteks seperti di node, yang langsung dieksekusi pada jendela objek. Oleh karena itu konteks panggilan bervariasi untuk Node.js dan Browser.

Baca juga ini.

Komentar (0)