我试图更好地理解 `this` 的用法。这个例子很冗长,但它的目的是为了更好地理解[重复]

Posted

技术标签:

【中文标题】我试图更好地理解 `this` 的用法。这个例子很冗长,但它的目的是为了更好地理解[重复]【英文标题】:I'm trying to better understand the use of `this`. The example is verbose, but its for the purpose of trying to better understand [duplicate] 【发布时间】:2019-11-16 09:23:17 【问题描述】:

我试图更好地理解this 的用法。在试验这段代码时,我发现我可以使用console.log(this.arr[4]) 之类的东西访问arr 中的项目,但前提是arr 是使用var 声明的。如果我使用letconst 声明arr,我会得到一个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])

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

【问题讨论】:

this 没有意义,应该只是console.log(arr[4]) 你应该阅读"this",这里没有合适的问题要回答。 您没有在代码示例中使用let...也就是说,使用“piqued”做得很好:)。 @epascarello。我知道我可以使用console.log(arr[4])。我的想法是,我认为 console.log(this.arr[4]) 会产生相同的结果,但事实并非如此。 【参考方案1】:

在浏览器中,***thiswindow,***var 声明也使变量可以作为window 的属性访问,而letconst 则不能。引用arr 的正确方法很简单

console.log(arr[4])

我不鼓励您使用*** this 甚至访问 var 声明,因为依赖于 var 行为的代码显然是令人困惑的,因为这种情况是一个完美的例子。

【讨论】:

【参考方案2】:

您感到困惑的行为并非特定于“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 语法/解释的重要部分。

【讨论】:

以上是关于我试图更好地理解 `this` 的用法。这个例子很冗长,但它的目的是为了更好地理解[重复]的主要内容,如果未能解决你的问题,请参考以下文章

更好地理解C#泛型

试图更好地理解 Chrome 和 Firefox 之间的跨域处理差异

试图更好地理解 VITERBI 算法

试图理解填充方法的使用

VUE this.$nextTick()异步刷新页面通俗用法

js中的this原理