在对象内使用方法参数时的Javascript行为

在对象内使用方法参数时的Javascript行为,javascript,Javascript,我对Javascript还相当陌生,在编写一些前端代码的时候,我曾多次遇到过这个问题。我在这里复制了这个: var obj1={ 功能1(val){ 如果(!this.obj2){ 此参数为0.obj2={ func2(){ 控制台日志(val); } } } this.obj2.func2(); } } obj1.func1(10); obj1.func1(20)在第一个代码段中,当您 if (!this.obj2) { this.obj2 = { func2() {

我对Javascript还相当陌生,在编写一些前端代码的时候,我曾多次遇到过这个问题。我在这里复制了这个:

var obj1={
功能1(val){
如果(!this.obj2){
此参数为0.obj2={
func2(){
控制台日志(val);
}
}
}
this.obj2.func2();
}
}
obj1.func1(10);

obj1.func1(20)在第一个代码段中,当您

if (!this.obj2) {
  this.obj2 = {
    func2() {
      console.log(val);
    }
  }
}
this.val = val;
var that = this;
已分配的
obj2
方法会在分配
val
参数时关闭其作用域中的
val
参数,即运行
obj1.func1(10)

在第二个代码段中,每次运行
func1
时,您都会为实例的
val
属性赋值:

func1(val) {
  this.val = val;

因此,当您稍后记录.val时,它始终是您刚刚传递的参数。

在第一种情况下,您有:

    if (!this.obj2) {
      this.obj2 = {
        func2() {
          console.log(val);
        }
      }
    }
因此,将func2始终设置为console.log,该值最初是使用该值创建的。第二次调用它时,它将只使用original
val
调用func2,因为函数保留对它们声明的原始作用域的访问权(这称为闭包)

第二次,当你

if (!this.obj2) {
  this.obj2 = {
    func2() {
      console.log(val);
    }
  }
}
this.val = val;
var that = this;

您将进入console.log动态引用
this
,因此它将是您传递的值,因为
this
在这个scop上会有所不同

据我所知,javascript中的“this”关键字始终指向应用程序本身或全局对象。您刚才所做的是设置一个对您试图使用的变量的引用,这就是我及时纠正这种行为的方法。我希望这至少有帮助

看看这篇文章


干杯。

谢谢您的快速回复。如果我理解正确的话,
func2
是一个闭包,对吗?第二个代码段之所以有效,是因为
func2
关闭了
that
变量,而不是
that.val
。因此,它仍然可以通过该对象引用访问修改后的值。这是正确的吗?是的,在第一次调用方法时,赋值函数关闭传递给方法的参数。在第二种情况下,闭包与之无关——区别在于第二种情况下有
this.val=val,更改实例,因此记录实例上的属性将显示更改。如果将第一个代码段更改为
this.val=val在第一行,您还可以看到记录的更改。