节点.js变量声明和作用域
Node.js variable declaration and scope
当我在node.js中键入它时,我得到undefined
.
var testContext = 15;
function testFunction() {
console.log(this.testContext);
}
testFunction();
=>undefined
如果没有var
关键字,它就会通过 (=>15)。它在Chrome控制台中工作(有和没有var
关键字)。
使用 var
时它在 Node 中不起作用testContext
因为它是当前模块的本地。您应该直接引用它:console.log(testContext);
。
当你不键入 var
时,发生的情况是testContext
现在是整个 Node 进程中的全局变量。
在Chrome(或任何其他浏览器 - 好吧,我不确定旧IE...)中,无论您在示例中是否使用var
都没关系,testContext
将转到全局上下文,这是window
。
顺便说一下,"全局上下文"是 JS 中函数调用的默认this
。
主要区别在于 Node.js 中的所有模块(脚本文件)都在自己的闭包中执行,而 Chrome 和其他浏览器直接在全局范围内执行所有脚本文件。
全局文档中提到了这一点:
其中一些对象实际上不在全局范围内,而是在模块范围内 - 这将被注意。
您在 Node 模块中声明的var
将被隔离到这些闭包之一,这就是为什么您必须导出成员以便其他模块访问它们的原因。
但是,当调用没有特定上下文的function
时,它通常会默认为全局对象 - 在 Node 中方便地称为 global
。
function testFunction() {
return this;
}
console.log(testFunction() === global); // true
而且,如果没有声明它的var
,testContext
将默认定义为全局。
testContext = 15;
console.log(global.testContext); // 15
如文档中所述
var 在 Node.js 模块中的某些内容将是该模块的本地内容。
因此,它将有所不同,因为var testContext
在模块上下文中,并且其上下文global
。
您也可以使用:
global.testContext = 15;
function testFunction() {
console.log(this.testContext);
}
testFunction();
问题与this
关键词有关。如果你这样做console.log(this)
你会看到testContext没有定义。您可能想尝试:
this.testContext = 15;
function testFunction() {
console.log(this.testContext);
}
testFunction();
- 当指令中已经给定作用域时,如何访问控制器中声明的函数
- try声明变量的作用域
- 将“*”分配给作用域中声明的变量的角度错误
- 节点.js变量声明和作用域
- jQuery 解绑在作用域中声明的事件
- 在另一个作用域中声明变量
- 在JS“if”语句参数中,是否有用于声明本地作用域变量的简明语法
- 阻止作用域声明..TypeScript和Asp.net MVC 5
- AngularJS:块作用域声明(let、const、function、class)在严格模式之外还不支持
- 根据用户输入声明多个作用域
- 为什么条件块中的函数声明在Chrome中提升到函数作用域,而在Firefox中不是?
- 如果在上层作用域中声明变量,则变量在局部作用域中是未定义的,并且在未执行的语句中在局部作用域中声明同名的变量
- Javascript:虽然变量是在全局作用域中声明的,但它在函数内部仍然是未定义的
- 在作用域中声明函数并稍后调用它
- 将作用域变量传递给在该作用域之外声明的闭包
- 声明前作用域中的函数
- 在文档内声明局部变量,或者在不同作用域的函数内声明局部变量
- Javascript作用域:在forEach循环内部声明的变量,而不是在forEach循环外部
- Javascript变量作用域——在函数外部声明的变量
- 在nodejs/commonjs模块的根作用域中声明对象——用var还是不用var