Javascript - 解构对象 - 'this' 设置为全局或未定义,而不是对象
Javascript - destructuring object - 'this' set to global or undefined, instead of object
我有一个具有两个函数的对象,foo
和 bar
。 bar
调用 foo
。
通常,这在 bar
使用 this.foo()
时工作正常。但是,当解构对象时,this
不再引用该对象。在下面的代码片段中,它是未定义的。当我在chrome中运行this时,它指的是window
对象。
预期产出
func1()
foo
objectValue
foo
bar
func2()
foo
objectValue
foo
bar
实际产量
func1()
foo
objectValue
foo
bar
func2()
foo
globalValue (or Uncaught TypeError, in the case of the code snippet, which breaks here)
Uncaught TypeError: this.foo is not a function (in the case of chrome, which breaks here)
*注意:要在 chrome 中重现,请将 let val = 'globalValue'
更改为 val = 'globalValue'
let val = 'globalValue'
let functions = {
val : 'objectValue',
foo : function(){
console.log('foo')
},
bar : function(){
console.log('this.val: ' + this.val)
this.foo()
console.log('bar')
}
}
class Class {
func1(functions){
console.log('func1()')
functions.foo()
functions.bar()
}
func2({foo, bar}){
console.log('func2()')
foo()
bar()
}
}
let instance = new Class()
instance.func1(functions)
console.log('\n')
instance.func2(functions)
解构与将 属性 分配给局部变量相同。 IE。在您的情况下,它将与
相同
var foo = functions.foo;
var bar = functions.bar;
函数未绑定到它们的 "parent" 对象。 this
指的是什么取决于函数的调用方式。 foo()
和 functions.foo()
是调用函数的两种不同方式,因此 this
在每种情况下都有不同的值。
这对 ES6 或解构来说并不是什么新鲜事,JavaScript 一直都是这样工作的。
参见 How does the "this" keyword work?。
我有一个具有两个函数的对象,foo
和 bar
。 bar
调用 foo
。
通常,这在 bar
使用 this.foo()
时工作正常。但是,当解构对象时,this
不再引用该对象。在下面的代码片段中,它是未定义的。当我在chrome中运行this时,它指的是window
对象。
预期产出
func1()
foo
objectValue
foo
bar
func2()
foo
objectValue
foo
bar
实际产量
func1()
foo
objectValue
foo
bar
func2()
foo
globalValue (or Uncaught TypeError, in the case of the code snippet, which breaks here)
Uncaught TypeError: this.foo is not a function (in the case of chrome, which breaks here)
*注意:要在 chrome 中重现,请将 let val = 'globalValue'
更改为 val = 'globalValue'
let val = 'globalValue'
let functions = {
val : 'objectValue',
foo : function(){
console.log('foo')
},
bar : function(){
console.log('this.val: ' + this.val)
this.foo()
console.log('bar')
}
}
class Class {
func1(functions){
console.log('func1()')
functions.foo()
functions.bar()
}
func2({foo, bar}){
console.log('func2()')
foo()
bar()
}
}
let instance = new Class()
instance.func1(functions)
console.log('\n')
instance.func2(functions)
解构与将 属性 分配给局部变量相同。 IE。在您的情况下,它将与
相同var foo = functions.foo;
var bar = functions.bar;
函数未绑定到它们的 "parent" 对象。 this
指的是什么取决于函数的调用方式。 foo()
和 functions.foo()
是调用函数的两种不同方式,因此 this
在每种情况下都有不同的值。
这对 ES6 或解构来说并不是什么新鲜事,JavaScript 一直都是这样工作的。
参见 How does the "this" keyword work?。