在对象内使用方法参数时的Javascript行为
我对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() {
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,该值最初是使用该值创建的。第二次调用它时,它将只使用originalval
调用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代码>在第一行,您还可以看到记录的更改。