今天看到一个面试题:
let des = "我在外边"
let obj = {
des: "我在里面",
foo: function() {
console.log(this.des)
}
}
let bar = obj.foo;
bar();
这个bar()
调用后会打印出什么?
本以为是考 this
,前两天刚好总结过this
,自以为这方便还阔以。大眼一看这肯定打印 我在外边
,还想骗我写我在里面
。作为一个谨慎的程序员,我就写了一个demo,尼玛,居然是undefined
,此时第一反应是不是浏览器问题,又换了一个浏览器,发现还是 undefined
。
首先在foo
函数中添加console.log(this)
,发现打印window
对象。查找windw对象,发现里面并没有des
属性。紧接着 在声明des
对象改成使用 var 来声明var des = "我在外边"
,发现打印的是我在外边
,并且window
对象中拥有des
属性。因此猜想let
定义全局属性时,不会作为window对象的属性。
查找let 文档发现,在程序和方法的最顶端,let不像 var 一样,let不会在全局对象里新建一个属性
:
var x = 'global';
let y = 'global';
console.log(this.x); // "global"
console.log(this.y); // undefined