0

我在使用 javascript 开发时注意到了一个不寻常的行为,有人可以向我解释一下吗?

我有这个 javascript 代码:

function MyFunction(){
   var categoryId = 'abc';
   var that = this;
   $(_elem).parent().find('[data-id]').each(function(){
   that.categoryId += $(this).data('id') + ',';
   });
   setEventsCategoryEx(categoryId, url, parentUrl);
}

应该是错误的,因为 categoryId 不是全局的,所以它不应该使用“that.categoryId”来访问。

问题是:当执行第一次进入 each 方法时,输出 that.categoryId 会生成“abc”(我分配给本地 categoryId 变量的值)。

当鼠标离开 each 函数时,that.categoryId 和 categoryId 有不同的值: categoryId = "abc" that.categoryId = "abc+"

我不明白以下内容:它们应该是单独的变量,为什么它们以相同的值开头?

谢谢,奥斯卡

编辑:对不起,复制和粘贴时我忘记添加函数声明。它位于由“onclick”事件调用的函数内。

4

2 回答 2

2

如果您不在函数内部,则var categoryId = 'abc'window.categoryId = 'abc'.

如果您不在函数内部,this则为window

所以你看到的是预期的行为。

请参阅您的 js 控制台以获取此实时示例

编辑:对不起,复制和粘贴时我忘记添加函数声明。它位于由“onclick”事件调用的函数内。

编辑后,我无法重现该问题

于 2012-08-13T15:46:37.527 回答
0

当您在非严格模式下调用未用作方法的函数时,则为this全局对象。

语言规范的第 11.2.3 节说:

产生式 CallExpression : MemberExpression *Arguments* 评估如下:

6. If Type(ref) is Reference, then
     If IsPropertyReference(ref) is true, then
       Let thisValue be GetBase(ref).
   Else, the base of ref is an Environment Record
     Let thisValue be the result of calling the ImplicitThisValue concrete method of GetBase(ref).
于 2012-08-13T15:49:36.353 回答