什么变量将被发送到匿名函数?

时间:2015-07-22 09:45:55

标签: javascript node.js

我正在使用名为Reqwest的javascript迷你库。它假设做ajax请求,但在Internet Explorer中它会抛出错误。 Peer dependency xhr2 required! Please npm install xhr2'。 Xhr2是一个库,假设与node.js一起使用我在前端运行代码。

我试图理解这段代码的作用,它是如何执行的以及变量的来源。我现在最好的选择是由于某种原因context.hasOwnProperty('window')是假的,并假设代码正在运行服务器端。但我不明白为什么。

!function (name, context, definition) {
  if (typeof module != 'undefined' && module.exports) module.exports = definition()
  else if (typeof define == 'function' && define.amd) define(definition)
  else context[name] = definition()
}('reqwest', this, function () {

  var context = this

  if (context.hasOwnProperty('window')) {
    var doc = document
      , byTag = 'getElementsByTagName'
      , head = doc[byTag]('head')[0]
  } else {
    var XHR2
    try {
      XHR2 = require('xhr2')
    } catch (ex) {
      throw new Error('Peer dependency `xhr2` required! Please npm install xhr2')
    }
  }
...
}

1 个答案:

答案 0 :(得分:1)

首先。

var bKey = new Buffer('abcdwAYserXbzcSeqL/zPg==', 'base64');
var cipher = crypto.createCipher('aes-128-ecb',bKey);
//cipher.setAutoPadding(auto_padding=false);
var crypted = cipher.update('abc',null,'base64');
crypted+=cipher.final('base64');
console.log(crypted);

这是

的捷径
!function(){}();

只需立即执行匿名函数( function() {} )();

例如,

function() {}

将打印!function(arg1){ console.log(arg1); }("argument1");

现在:

argument1

!function(name,context, definition) namecontext分别为definition"reqwest"和声明的匿名函数

在浏览器中,对象thisthis对象,但在Node.js中,它相当于module.exports对象(如果没有任何其他模块填充,则为空对象) )

现在,在匿名函数

Window

检查我们是否在Node.js环境中,始终定义对象(typeof module != 'undefined' && module.exports) module

module.exports

检查我们是否有requireJs(在浏览器环境中)。

在第一种情况下,它导出执行作为参数传递的函数的模块(将返回一个对象或函数)。它就像Node.js一样。

在第二种情况下执行函数define,就像requireJs一样。

在最后一种情况下,将模块(作为函数的返回)放在上下文对象中(可能是Window)。

在函数内部,我们有:

(typeof define == 'function' && define.amd)

检查我们是否在浏览器environemnt中(对象窗口有属性窗口)。 如果我们在浏览器中,我们有一些本机函数(如XMLHttpRequest),但在Node.js中我们必须加载为外部库(如xhr2)。然后

if (context.hasOwnProperty('window')) {

等......:)