美文网首页让前端飞
关于let声明的变量在window里无法获取到的问题

关于let声明的变量在window里无法获取到的问题

作者: alex夏夜 | 来源:发表于2019-04-26 08:52 被阅读1次

近期突然发现一个问题

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

相关文章

  • 关于let声明的变量在window里无法获取到的问题

    近期突然发现一个问题 乍一看这么幼稚的题,window调用,this指向window,打印'1'.结果却是unde...

  • var与let、const的区别

    var声明的变量会挂载在window上,而let和const声明的变量不会 2.var声明变量存在变量提升,let...

  • var、const和let

    一.var声明的变量会挂载在window上,而const和let变量不会 二.var声明变量存在变量提升,let和...

  • 杂货小铺之ES6+ 🍕 Let

    let ? ES6新增了let命令,用来声明变量 let声明的全局变量不是全局对象window的属性; ? :va...

  • [ES6]1.2Let和Const

    Let 1、let声明的全局变量不是全局对象window的属性 不能用window.变量名的方式访问变量。 var...

  • js中var,let,const的区别

    var声明的变量会挂载在window上,而let,const不会 var声明变量存在声明提升,其他声明方式不提升 ...

  • JS-基础知识-let与const

    1. let与const var声明的变量会挂载在window上,而let和const声明的变量不会1.为了解决J...

  • var,let,const的区别

    var声明的变量会挂载在window上,而let和const声明的是块作用域 var声明的变量存在变量提升,而le...

  • let,var,const

    let 、const块级声明用于声明在指定块的作用域之外无法访问的变量。let 用于声明变量, const 用于声...

  • const、let、var 的区别

    1、var 声明的变量会挂载在window上。 2、var 生命变量存在变量提升。 3、let、const 块作用...

网友评论

    本文标题:关于let声明的变量在window里无法获取到的问题

    本文链接:https://www.haomeiwen.com/subject/hzmxnqtx.html