我在使用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”事件调用的函数内。
答案 0 :(得分:2)
如果您不在某个功能中,则var categoryId = 'abc'
与window.categoryId = 'abc'
具有相同的效果。
如果您不在某个功能中,则this
为window
所以你看到的是预期的行为。
请参阅your js console for this live example
编辑:对不起,当coppying和粘贴我忘了添加函数声明。它位于一个由“onclick”事件调用的函数内。
答案 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).