我有一个加载的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在功能范围,以及它为什么不其注入到模块的范围?
是否可以在文件范围内添加属性(使用get和set方法)而不使其成为全局文件?(类似于变量声明的方式let或const将如何工作)
这是我到目前为止编写的代码,它可以向全局范围添加属性。
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)
但是,每次我想要获取/设置属性时,我仍然需要键入该变量的名称。
那么有没有办法创建一个属性
代码示例是 -
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
代码
我编写以下代码并将其另存为 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)
?
以下函数在节点和浏览器中提供两种不同的结果:
(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两次,正如我所料.
所以问题是......为什么?