var b = 20;
var a = {
b: 15,
fn: function() {
var b = 30;
return function() {
return this.b;
};
}
};
console.log(a.fn()());
不应该打印20吗
但是我在vscode下打印undefined
控制台里打印20
这是为什么?新手不是很懂
var b = 20;
var a = {
b: 15,
fn: function() {
var b = 30;
return function() {
return this.b;
};
}
};
console.log(a.fn()());
不应该打印20吗
但是我在vscode下打印undefined
控制台里打印20
这是为什么?新手不是很懂
控制台里是全局环境。
但是 node 里没有真正的全局环境,他会把你的代码都放一个函数里去执行。
两个 this 都是全局对象,但是由于在 node 里,代码(包括 var)都是被一个函数里跑的,所以变量不会被加入全局对象。
我测试是 在node环境打印 20 undefined;
在chrome浏览器控制台打印undefined.
这么看来其实和this没有关系,而是和console.log的执行机制有关系。
console.log(xxx)在浏览器控制台其实是无效的,它不会打印出xxx,但是会打印一个undefined。
这是因为不管在浏览器还是node,语句执行结束都会把该句的返回值打印出来,包括console.log。
console.log没有返回值(返回默认的undefined),所以你执行一句console.log在node和浏览器控制台都会打印undefined。
此外 a.fn()()返回20,这个在非严格模式下应该是正确的,因为未指定函数的调用者,this绑定到全局对象上,全局对象里有var声明的b。但在严格模式下,this为undefined,this.b应该报错。
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
因为运行环境不一样
第一个输出 20,是浏览器环境,因为浏览器有全局的
window
,var
声明默认挂在了window
上第二个
node
环境,全局是global
,但是var
声明不会挂在global
上,所以是undefined
你可以直接输出
this
看看,第一个是window
,第二个是global