Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 处理时出现奇怪的JS行为;那";在每个函数的内部_Javascript - Fatal编程技术网

Javascript 处理时出现奇怪的JS行为;那";在每个函数的内部

Javascript 处理时出现奇怪的JS行为;那";在每个函数的内部,javascript,Javascript,我注意到在使用javascript开发时有一个不寻常的行为,有人能给我解释一下吗 我有一个javascript代码: function MyFunction(){ var categoryId = 'abc'; var that = this; $(_elem).parent().find('[data-id]').each(function(){ that.categoryId += $(this).data('id') + ','; }); setEven

我注意到在使用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方法时,输出 categoryId将生成“abc”(我分配给本地categoryId变量的值)

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

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

谢谢, 奥斯卡


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

如果不在函数内,则
var categoryId='abc'
window.categoryId='abc'具有相同的效果。


如果您不在函数中,则
窗口

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

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


编辑后

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

说:

生产调用表达式
成员表达式*参数*的计算如下:

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

此代码在哪个范围内执行?如果可以访问this.categoryId,为什么不能访问该.categoryId?(同一对象)@jbabey对不起,我忘了添加范围。它位于函数内部,有关详细信息,请参见编辑。@robbieAreBest抱歉,我不太理解您的评论。这个问题的原因是为了理解为什么这两个变量具有相同的初始值(即使我只是将其分配给其中一个变量)和不同的最终值。它们在执行后有不同的值,很明显,因为JS中的变量不是通过引用传递的。Strict模式在这里很好,当您不在对象上下文中时,为
这个
获取隐式全局值是非常糟糕的。不仅仅是“如果您不在函数中”,而是“如果您没有显式的对象上下文”(例如,将函数作为对象的成员函数调用,或将上下文传递到
调用
应用
@PhillipSchmidt hm,明白了吗,但为什么它们具有相同的初始值?@oscar因为在全局范围内,
指的是
窗口
。当您定义全局变量时,它们被定义为prope。)
window
的RTE。因此,既然您将
that
变量设置为
this
,那么您将它设置为
window
categoryId
window
的一个属性,因为您在全局范围内定义了它。因此,在您的例子中,当它开始时,
this.categoryId==that.categoryId==categoryId
'