0

注意:请记住,这不是关于this在 javascript 上使用的通用问题。这是关于 aspect.around 故障(它是为了设置调用的范围,但它没有)。问题是:为什么 aspect.around 出现故障?这个问题需要您仔细阅读如何使用提供的小提琴进行复制和复制!

为了解决这个问题,我不得不将我的应用程序撕成碎片。所以这里是:

http://jsfiddle.net/mercmobily/THtsv/1/

这是一个简单的表单,带有验证:

  • 在文本框中输入一些内容:将调用小部件的验证方法。
  • 然后按下提交按钮:验证将失败,并且将调用 aspect.around 来包装验证方法。
  • 此时尝试再次在文本框中输入任何内容:它将返回错误,因为验证器将失败,因为“this”被设置为“window”而不是小部件。

因此,一旦添加了方面,验证器就会停止工作。基本上,“this”的价值会丢失。现在:

  • aspect.around() 旨在在正确的范围内(显然)运行新的验证器,但它没有这样做

  • 我可以通过将验证器的调用更改为此来“解决”这个问题:return originalValidator.call(this, value);但是,它没有回答“为什么'这个'丢失?”这个问题。

  • 如果你回溯代码,你会看到 aspect.around() 正在做它通常做的事情......但它一定做错什么

那么,问题是:为什么 dojo.around() 出现故障,而不是设置this为传递对象的范围?

默克。

4

2 回答 2

1

遵循您的确切要求并不容易。从您的 jsFiddle 中,我看到了此评论,因此我将尝试回答您在此处提出的问题:

  // QUESTION: FIND OUT WHY WE NEED THIS "call"
  return originalValidator(value);
  // return originalValidator.call(this, value);

为什么你需要.callhere 以保留 的值的答案正如我在下面关于进行函数调用时的工作原理this的一般描述中所描述的那样。this

当您像以下语句一样进行普通函数调用时:

  return originalValidator(value);

的值this重新设置为window。这就是javascript的工作原理。如果要保留该函数中的当前值,则必须使用or或调用this指定要设置的特定值。普通函数调用中的值不绑定到函数。它由调用者设置,可以是调用者想要的任何东西。如果您不指定它,则 javascript 设置为,这正是您的代码中发生的情况。this.call().apply()obj.method()thisthiswindow


这是如何设置值的通用描述,this并且此通用描述适用于您的特定情况。

简单的规则是thisjavascript 中的每个函数调用都会重置 的值。如果它只是一个普通的函数调用,则this设置为全局对象(window在浏览器环境中)。所以任何简单的函数调用都将始终设置thiswindow.

如果你做一个方法调用之类的obj.method(),那么this会被设置为指向objwhile中的method()

如果您使用func.apply(a, b)or ,func.call(a, b)那么您可以通过orthis的第一个参数的值显式控制设置的内容。请在此处此处查看此 MDN 文档以获取有关和的更多信息。.apply().call().call().apply()

于 2012-08-18T05:29:26.423 回答
0

this是当前上下文。默认情况下,它是全局对象(或null在严格模式下),当在对象 ( ) 上调用函数时,foo.bar()它被设置为该对象。当使用.call().apply()调用函数时,它被设置为传递给该函数的任何第一个参数。

这意味着当你进入另一个函数时,你不能假设它this仍然是相同的——即使你在this你想要的上下文中定义了那个函数。

最常见的方法是在内部函数中添加var self = this;然后使用self而不是- 因为它是一个普通变量,它将位于函数的闭包中,并且不受绑定到函数中的其他内容的影响。thisselfthis

于 2012-08-18T02:39:27.427 回答