近期突然发现一个问题
let name = '1'
var obj1 = {name: 'obj1', fn: function() {
console.log(this.name);
}};
var newFn = obj1.fn;
newFn();
乍一看这么幼稚的题,window调用,this指向window,打印'1'.
结果却是undefined。
一头雾水的我跑到网上搜罗一番,在此作为记录:
为什么会出现这种问题,就需要知道ES6与ES5变量声明方面的区别了:
ES5声明变量只有两种方式:var和function。
ES6有let、const、import、class再加上ES5的var、function共有六种声明变量的方式。
还需要了解顶层对象:浏览器环境中顶层对象是window,Node中是global对象。
ES5中,顶层对象的属性等价于全局变量。(敲黑板了啊)
ES6中,有所改变:var、function声明的全局变量,依然是顶层对象的属性;let、const、class声明的全局变量不属于顶层对象的属性,也就是说ES6开始,全局变量和顶层对象的属性开始分离、脱钩。
所以ES6非严格模式下,与var声明的全局变量都会成为window的属性:
a = 1;
console.info(window.a); // 1
var b = 2;
console.info(window.b); // 2
而使用let声明的全局变量,不会成为window的属性:
let c = 3;
console.info(window.c); // undefined
原文:https://blog.csdn.net/fang_ze_zhang/article/details/83419022