NodeJS中的“全局”对象是什么

时间:2017-04-26 07:26:51

标签: javascript node.js scope this global

我刚刚在NodeJS环境中看到了this关键字的奇怪行为。我用代码列出它们。我已使用NodeJS v6.x运行此代码,并使用一个JavaScript文件。

使用以下一行代码进行测试时,无论是否使用'use strict'语句,都会指向空对象{}

console.log(this)

但是,当我在自执行函数中运行语句时,

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

它正在打印一个非常大的对象。在我看来是NodeJS环境创建的全局执行上下文对象。

使用'use strict'语句执行上述功能时,预计会打印undefined

(function(){
  'use strict';

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

但是,在使用浏览器时(我只使用Chrome进行了测试),前三个示例产生了window对象,最后一个示例按预期提供了undefined

浏览器的行为非常容易理解。但是,在NodeJS的情况下,它是否不会创建执行上下文,直到我在函数内部包装?

那么,NodeJS中的大部分代码都是空的全局 object

7 个答案:

答案 0 :(得分:28)

在浏览器中,全局范围是window对象,在nodeJS中,模块的全局范围是模块本身,因此当您在nodeJS模块的全局范围内定义变量时,它将是本地的到这个模块。

您可以在 NodeJS documentation 中了解详情:

  

<强>全球

     

<Object> The global namespace object.

     

在浏览器中,顶级范围是全局范围。这意味着   在浏览器中,如果你在全局范围内var会定义一个   全局变量。在Node.js中,这是不同的。顶级范围是   不是全球范围;在Node.js模块中的var将是   该模块的本地。

当你写下代码时:

  • console.log(this)在空的js文件(模块)中,它将打印一个空对象{},指向您的空模块。
  • 自我调用函数中的
  • console.log(this); this将指向全局nodeJS范围对象,该对象包含所有NodeJS公共属性和方法,例如require()module,{ {1}},exports ...
  • 在自调用函数中使用strict mode
  • console将打印console.log(this),因为自调用函数在Strict mode中没有默认的本地范围对象。

答案 1 :(得分:10)

节点模块中this的值:

NodeJS 全局范围中的

this是当前的module.exports对象,而不是全局对象。这与全局范围是全局window对象的浏览器不同。考虑在Node中执行以下代码:

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

module.exports.foo = 5;

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

首先,我们记录一个emty对象,因为此模块中module.exports中没有值。然后,将foo放在module.exports对象上,然后再次登录this时,我们可以看到它现在记录了更新的module.exports对象。

我们如何访问global对象:

我们可以使用global关键字访问节点中的global对象:

console.log(global);

global对象公开了有关环境的各种有用属性。这也是setImmediateclearTimeout的功能所在的地方。

答案 2 :(得分:3)

非常有趣:

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));
}());

将产生:

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

3) 未定义,因为它未以严格模式自动装箱到对象。这意味着在此上下文中没有根对象。如果您不使用严格模式,那么您的代码将由父范围装箱。正如您在输出中看到的那样,在nodejs中有很多关于节点内部内容的信息。

1)中,输出是一个空对象,因为在节点模块的顶级代码中,这相当于module.exports,而module.exports在此示例中为空。

答案 3 :(得分:3)

从节点环境中的全局上下文开始documentation

  

在浏览器中,顶级范围是全局范围。这意味着在浏览器中,如果您处于全局范围内,var会定义一个全局变量。在Node.js中,这是不同的。顶级范围不是全球范围; Node.js模块中的var内容将是该模块的本地内容。

每个JS文件都被视为一个模块。 Node自动将JS文件的代码包装在自我IIFE中,exports, require, module, __filename, __dirname作为函数的参数。

以下是使用node-debug

的执行上下文的屏幕截图

node-debug

如果您运行以下代码,请打印true,这意味着this引用node.js中的exports。最好在此answer中解释。

console.log(this === exports);

这意味着在执行时,代码在Node.js中包含类似于下面的内容,使用 包装函数上下文 将代码与全局上下文分开。

  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"]);

回答下一点完全参考documentation

  

与其他语言相比,此关键字在JavaScript中的行为略有不同。它在严格模式和非严格模式之间也有一些区别。

所以当你执行这段代码时

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

打印global对象,并以use strict模式打印undefined

<强>记住:

在浏览器中,函数不像IIFE /包装函数上下文一样包装在节点中,它直接在window对象上执行。因此,调用上下文因Node.js和Browser而异。

另请阅读this

答案 4 :(得分:2)

global 是对 NodeJS 中真正的全局作用域对象的引用,有点像在浏览器 JS 环境中使用 window

global.studentName = 'Kyle'

console.log(`Hello, ${ global.studentName }!`)
// Hello, Kyle!

console.log(`Hello, ${ studentName }!`)
// Hello, Kyle!

答案 5 :(得分:1)

这里我要强调 global 的一个属性!

<块引用>

你放在那里的东西也可以直接访问

(确保检查属性标题和部分)

在带来财产之前!让我们再次定义全局!

global 是 nodejs 特有的语言关键字,引用全局命名空间对象

正如其他答案中已经描述的那样!模块中的顶级范围!不是全球性的!并且仅限于该模块!

所以当你在一个模块中声明一个变量时,你不能在另一个模块中访问它!

https://nodejs.org/api/globals.html#globals_global

全局命名空间在给定进程的任何地方都可以访问!在所有模块中!这包括您自己的模块和第三方模块!

节点 repl 中的控制台日志记录全局将给出:

Welcome to Node.js v13.14.0.
Type ".help" for more information.
> console.log(global)
<ref *1> Object [global] {
  global: [Circular *1],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setInterval: [Function: setInterval],
  setTimeout: [Function: setTimeout] {
    [Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
  },
  queueMicrotask: [Function: queueMicrotask],
  clearImmediate: [Function: clearImmediate],
  setImmediate: [Function: setImmediate] {
    [Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
  }
}
undefined

属性:你放在那里的东西也可以直接访问

我想带的是这个!我在探索 laravel-mix 代码源时注意到了这一点!

<块引用>

如果你在全局对象上设置了一些东西!就像global.Hola = { print: () => console.log("Hola") };。然后,您可以在项目代码(多个文件 [模块] 和整个节点流程代码)中的任何位置直接通过其名称访问变量!意思是 Hola.print() 代替 global.Hola.print()

这是上面示例的节点 repl 屏幕截图:

> global.Hola = { print: () => console.log('Hola') }
{ print: [Function: print] }
> Hola.print()
Hola
undefined

enter image description here

不错的物业!那就是全局命名空间!

您会注意到 clearInteravalclearTimeoutsetIntervalsetTimeout、...等方法都定义在那里!我们过去常常通过名称直接访问它们!

Laravel 混合示例

这里有一些来自 laravel-mix 代码源的例子!它在哪里使用它!

如果你打开这个文件: https://github.com/JeffreyWay/laravel-mix/blob/master/src/components/ComponentRegistrar.js

您注意到导入部分没有! Mix 变量都不是 Config! 但它们是使用和代码的一部分!我当时想:what the heck

进口代码:

let Assert = require('../Assert');
let Dependencies = require('../Dependencies');
let mergeWebpackConfig = require('../builder/MergeWebpackConfig');

在第 68 行:(link here) 可以看到 Mix 类变量的用法!

enter image description here

第 178 行 (link here) 的 Config 也是如此

enter image description here

当我第一次看到它时!并检查导入部分!并使用 github 参考功能(一无所获)!我是What the heck

后来当我检查 Mix.js 文件时!还有课!我找到了设置它们的代码!我得到了直觉并用谷歌搜索!

enter image description here

冲突以及为什么要使用全局命名空间

设置全局变量的问题是覆盖和冲突!这会导致错误和意外行为,直至完全崩溃!如果模块不假思索地开始使用它!一个模块会把它拧成另一个!就像使用第三方模块时一样!想象一下,模块 request 将设置 Config var!你也设置了!甚至另一个第三方模块!而且都依赖于它!一个会把它拧到另一个模块上!

简单地说!我们不应该使用全局变量! 不不是的

这一切都取决于!

模块最好不要这样做!这样模块就完全隔离了!而且更结实!一般在某个模块中设置变量!并且每次都导入它!使用依赖注入...等

在许多情况下,使用全局命名空间更灵活

你可以这样做,不用担心!如果您要构建服务器配置对象可以去全局! 命令行界面工具或脚本!一些直接运行的进程!

通常构建模块时不要使用全局范围一个包裹图书馆一个组件哪些可以重复使用! (可重用的交叉项目!没有全局范围!隔离它)!

Laravel mix 例如是一个用于生成 webpack 配置的包!可以作为 cli 工具和进程运行!

但是,如果 Config 变量也是由 Webpack 或一些社区插件或加载器设置的!然后问题可能由于覆盖而发生!

命名添加一个可以使更安全变得很简单!例如 Mix_Config !

答案 6 :(得分:0)

我写了一个全面的答案,涵盖了不同情况下this的价值。解释在需要的地方添加为代码注释。

let this_in_objects = {
    propA: "let's figure THIS out!",
    /*
    * Object property set to a standard function.
    * */
    propB: function () {
        return this.propA;
        // Returns the value of this_in_objects.propA as expected.
    },
    /*
    * Object property set to an arrow function (Introduced in ES6).
    * */
    propC: () => {
        return this.propA;
        // Should return 'undefined'
        // In this case, 'this' refers to the surrounding scope, which could be one of the following :
        // - 'module.exports' if the code is inside a nodejs module.
        // - 'window' if the code is executed in a browser, or 'undefined' if running in a terminal due to the lack of 'window' global variable.
    },
    /*
    * Object property set to a standard function that returns an arrow function.
    * */
    propD: function () {
        let newArrowFunction = () => {
            return this.propA;
            // Returns the value of this_in_objects.propA.
            // The first functions declaration binds 'this' to the current object
            // then the second function scope is now the 'this' of the first function.

        }
        return newArrowFunction;
    },
    /*
    * Object property set another object with 2 properties, one of which returns a standard function.
    * */
    propE: {
        propE_1: "value of propE.propE_1",
        propE_2: function () {
            return this.propE_1;
            // In this case, 'this' refers to the surrounding scope, which is the parent object 'propE'
        }
    },
    /*
    * Object property set another object with 2 properties, one of which returns an arrow function.
    * */
    propF: {
        propF_1: "value of propF.propF_1",
        propF_2: () => {
            return this.propF_1;
            // Should return 'undefined'
            // There no change in the binding of 'this', so
            // In this case, 'this' refers to the surrounding scope, which could be one of the following :
            // - 'module.exports' if the code is inside a nodejs module.
            // - 'window' if the code is executed in a browser, or 'undefined' if running in a terminal due to the lack of 'window' global variable.
        }
    },
};

console.log(this_in_objects.propB());
// Returns "let's figure THIS out!"

console.log(this_in_objects.propC());
// Returns 'undefined'

console.log(this_in_objects.propD()());
// Returns "let's figure THIS out!"
// Notice the double round brackets to call the nested anonymous functions.

console.log(this_in_objects.propE.propE_2());
// Returns "value of propE.propE_1"

console.log(this_in_objects.propF.propF_2());
// Returns 'undefined'


this_in_objects.propX = function () {
    return this.propA;
    // Returns the value of this_in_objects.propA as expected.
};
this_in_objects.propA = 'The new value of propA !';

console.log(this_in_objects.propX());
// Returns "The new value of propA !",
// even though 'propA' value was changed AFTER declaring the function,
// returning the value of 'propA' at the time of function execution, not at the time of declaration.

这是基于以下信息:

我希望这会有所帮助,如果我错过了this的值可能不同的任何情况,请在评论中告诉我。