相关疑难解决方法(0)

node.js模块和函数中"this"的含义

我有一个加载的JavaScript文件require.

// loaded by require()

var a = this; // "this" is an empty object
this.anObject = {name:"An object"};

var aFunction = function() {
    var innerThis = this; // "this" is node global object
};

aFunction();

(function(anyParameter){
    console.log(anyParameter.anObject);
})(
    this // "this" is same having anObject. Not "global"
);
Run Code Online (Sandbox Code Playgroud)

我的问题是:this在var中a = this;是一个空对象,而this函数中的语句是node.js全局对象的阴影.我知道this关键字在函数中有所不同,但我无法理解为什么第一个this不等于全局,this而函数等于全局.

如何node.js的注入global,以this在功能范围,以及它为什么不其注入到模块的范围?

javascript node.js

35
推荐指数
3
解决办法
3万
查看次数

向节点文件添加属性

是否可以在文件范围内添加属性(使用getset方法)而不使其成为全局文件?(类似于变量声明的方式letconst将如何工作)

这是我到目前为止编写的代码,它可以向全局范围添加属性。

var propertyValue;

Object.defineProperty(global, "PropertyValue", {
    get: function () {
        return propertyValue;
    },
    set: function (value) {
        propertyValue = value;
    }
});

console.log(PropertyValue);
Run Code Online (Sandbox Code Playgroud)

是否可以使该属性仅对声明该文件的文件可见。可以通过声明一个变量并在其中添加所有属性来完成相同的操作。

var fileProperties;
var propertyValue;

Object.defineProperty(fileProperties, "PropertyValue", {
    get: function () {
        return propertyValue;
    },
    set: function (value) {
        propertyValue = value;
    }
});

console.log(fileProperties.PropertyValue);
Run Code Online (Sandbox Code Playgroud)

但是,每次我想要获取/设置属性时,我仍然需要键入该变量的名称。

那么有没有办法创建一个属性

  1. 不完全是全球性的
  2. 无需说明所有者对象即可访问
  3. 可以被eslint认可

javascript global properties this node.js

5
推荐指数
1
解决办法
263
查看次数

nodejs 和 Chrome 中 setTimeout 的不同行为

代码示例是 -

global.a = 'aaa';

const obj = {
    a: 'a',
    desc() {
        console.log(this);
        console.log(this.a);
    }
}

setTimeout(obj.desc, 2000)
Run Code Online (Sandbox Code Playgroud)

当我在 nodejs 中运行此代码时,我得到以下输出:

Timeout {
  _called: true,
  _idleTimeout: 2000,
  _idlePrev: null,
  _idleNext: null,
  _idleStart: 79,
  _onTimeout: [Function: desc],
  _timerArgs: undefined,
  _repeat: null,
  _destroyed: false,
  [Symbol(asyncId)]: 6,
  [Symbol(triggerAsyncId)]: 1 }
undefined
Run Code Online (Sandbox Code Playgroud)

但是相同的代码,在 Chrome/Firefox 打印和对象中global更改为,这就是这个 MDN文档所说的,也是我所期望的。windowaaawindow

我的印象是 nodejs 和 Chrome 都使用谷歌的 v8 JS 引擎来执行 JavaScript。那么为什么输出不同呢?还有什么比这更重要的吗?我尝试搜索,但找不到满意的答案。

节点版本 - v9.10。
Chrome 的版本 - 版本 70.0.3538.110

javascript node.js

5
推荐指数
1
解决办法
520
查看次数

Node.js:在模块作用域中使用“this”运算符时,其上下文是什么?

代码

我编写以下代码并将其另存为 test.js:

var foo = 'I am local';
global.foo = 'I am global';

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

print(); 
console.log (this.foo); 
Run Code Online (Sandbox Code Playgroud)

然后我使用命令在终端中运行它node test.js,它返回:

I am global
undefined
Run Code Online (Sandbox Code Playgroud)

问题

为什么不返回:

I am global
I am global
Run Code Online (Sandbox Code Playgroud)

javascript global-variables this node.js

4
推荐指数
1
解决办法
3846
查看次数

函数执行上下文,浏览器与nodejs

以下函数在节点和浏览器中提供两种不同的结果:

(function funfunfun(root, factory) {
    console.log(root === this);
    factory(root);
})(this, function (root) {
    console.log(root === this);
});
Run Code Online (Sandbox Code Playgroud)

在节点中,它将输出两次false.在浏览器中,它将输出true两次,正如我所料.

所以问题是......为什么?

javascript node.js

3
推荐指数
1
解决办法
72
查看次数