处理每个函数内部的“那个”时的奇怪JS行为

时间:2012-08-13 15:41:24

标签: javascript

我在使用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”访问它。

问题是: 当执行首先进入每个方法时,输出 that.categoryId会生成“abc”(我赋给本地categoryId变量的值)。

当鼠标离开每个函数时,that.categoryId和categoryId具有不同的值: categoryId =“abc” that.categoryId =“abc +”

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

感谢, 奥斯卡

编辑:对不起,当coppying和粘贴我忘了添加函数声明。它位于一个由“onclick”事件调用的函数内。

2 个答案:

答案 0 :(得分:2)

如果您不在某个功能中,则var categoryId = 'abc'window.categoryId = 'abc'具有相同的效果。

如果您不在某个功能中,则thiswindow

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

请参阅your js console for this live example

  

编辑:对不起,当coppying和粘贴我忘了添加函数声明。它位于一个由“onclick”事件调用的函数内。

编辑完成后,I can't reproduce the problem

答案 1 :(得分:0)

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

Section 11.2.3 of the language spec说:

  

生产 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).