你好,我有一个问题,有这么一段代码。
var obj = {
num: 10,
method: function(){
function test(){
console.log(this.num);
}
test();
}
}
obj.method(); // undefined
它将返回 undefined 因为测试函数调用上下文是全局的。但是如果我们一开始就声明了num这个变量,然后给它赋值。这将打印全局上下文的结果。
var num = 11;
var obj = {
num: 10,
method: function(){
function test(){
console.log(this.num);
}
test()
}
}
obj.method(); //11
我在节点和浏览器中测试了它并且它有效。但是在节点中它只能在 REPL 模式下工作,如果我从文件中为它提供脚本,它会返回未定义的结果,你能告诉我为什么会这样吗?
nodejs和浏览器的区别在于它已经支持javascript中的模块。
模块之间的一个重要区别是,
var为模块全局声明的变量不会添加到全局对象中,而是添加到模块中。任何文件都被视为一个模块,因此在 REPL 中使用相同的代码并从文件加载可能会导致意外结果。
在上面的代码中,可以注意到test函数里面的this指向的是全局对象(在浏览器中是window,在node中是global)。
当在浏览器或 REPL 中运行代码时,num 变量被添加到全局对象中,它的值可以通过
this从文件加载时,变量被添加到模块中,而不是全局对象中,因此无法通过 获取其值
this。