我试图更好地理解`this`的用法。该示例很冗长,但其目的是为了更好地理解

时间:2019-07-05 19:12:22

标签: javascript ecmascript-6 scope this

我试图更好地了解this的使用。在尝试这段代码时,我发现可以使用类似arr的东西来访问console.log(this.arr[4])中的项目,但前提是必须使用arr声明var。如果我使用arrlet声明const,则会收到TypeError。

首先,我知道这很冗长。就像我说的那样,我只是在尝试以寻求更好的理解,并发现了这个引起我好奇的问题。

const arr = [
  1,
  false,
  {
    name: 'John',
    address: '123 Peachtree Drive'
  },
  function(name = 'new user') {
    const greeting = 'Hello there, '
    console.log(greeting + name)
  },
  'foo',
]

console.log(this.arr[4])

同样,如果我只是使用arr而不是var来声明let,那么我可以很好地记录它。

2 个答案:

答案 0 :(得分:4)

在浏览器中,顶级thiswindow,顶级var声明还使变量可以作为window的属性访问,而{{1} }和let没有。引用const的正确方法很简单

arr

我不鼓励您使用顶级console.log(arr[4]) 甚至访问this声明,因为依赖于var的行为的代码显然令人困惑,因为这种情况很完美的例子。

答案 1 :(得分:0)

让您感到困惑的行为并不特定于“ this”。它与范围有关。 “ var”的作用域与“ let”或“ const”的作用域不同。

var - has function level scoping and can change the value reference
let - has block level scoping and can change the value reference
const - has block level scoping but cannot change the value reference

https://love2dev.com/blog/javaScript-var-let-const/

请准确声明变量的方式和位置,因为这是JavaScript语法/解释的重要组成部分。