保存对此范围的访问权限
我的颜色存储在我的button的数据属性,我想用在切换。 但是,当我试图使用this
访问数据信息时,没有数据可用。 我怎样才能保持我访问正确的范围?
我试图只切换给定的颜色为不包含跳过的元素。
HTML
<div> <input id="toggleButton" type="button" value="Toggle" data-color="Red" /> </div> <div id="toggleSet"> <div>Element</div> <div>Skip</div> <div>Element</div> </div>
CSS
.ActivateRed{ color: red; }
JS
$('#toggleButton').click(function(){ $("#toggleSet div").each(function(index,element){ if( element.innerHTML != "Skip" ){ $(element).toggleClass("Activate"+$(this).data("color")); //^this has no data to access? //Why am I getting undefined? } }); });
这是我的尝试jsFiddle 。 我不断得到Activateundefined
作为类名。 为什么不能访问我的toggleButton数据?
问题的解释
这改变了
this
MDN的值已更改,不再引用预期的元素或值。 通常这是因为范围已经改变,因此也有this
参考。
这包含在执行上下文中
范围是指当前的执行上下文ECMA 。 为了理解this
变化的原因,理解这些执行上下文在JavaScript中的运行方式非常重要。
执行上下文绑定这个
当控制进入执行上下文(代码在该范围内执行)时,variables的环境被设置(词法和可变环境 – 本质上,这设置了已经可访问的variables进入的区域,局部variables的区域存储),并发生这种绑定。
这个绑定被改变了执行上下文
这些上下文构成了一个逻辑堆栈。 结果是栈中更深的上下文可以访问以前的variables,但是它们的绑定可能已经被改变了。 每次jQuery调用一个callback函数,它都会使用apply
MDN来改变这个绑定。
callback.apply( obj[ i ] )//where obj[i] is the current element
调用apply
的结果是,在jQuerycallback函数内部, this
指的是callback函数使用的当前元素。
例如,在.each
,通常使用的callback函数允许.each(function(index,element){/*scope*/})
。 在这个范围内, this == element
是真的。 这样做的结果是,如果您期望以前的this
可用,它将被绑定到一个不同的元素。
this
在jQuerycallback中的简短解释
如上所示,jQuerycallback函数使用apply函数将被调用的函数与当前元素进行绑定。 这个元素来自jQuery对象的元素数组。 构造的每个jQuery对象都包含一个元素数组,这些元素与用于实例化jQuery对象的select器jQuery API相匹配。
$(selector)
调用jQuery函数(请记住$
是对jQuery
的引用,代码: window.jQuery = window.$ = jQuery;
)。 在内部,jQuery函数实例化一个函数对象。 所以,虽然它可能不是很明显,使用$()
内部使用new jQuery()
。 这个jQuery对象的一部分构造是查找select器的所有匹配。 然后,jQuery对象包含与select器匹配的DOM元素的类似数组的结构。
当一个jQuery api函数被调用时,它将内部遍历这个类似数组的结构。 对于数组中的每一项,它都会调用api的callback函数,将callback的this
绑定到当前元素。 这个调用可以在上面的代码片断中看到,其中obj
是类似于数组的结构,而i
是用于当前元素数组中位置的迭代器。
find一个解决scheme
可能很难确定发生了什么,因为jQuery往往默默地失败。 .data()
jQuery API在这里仍然是一个有效的调用,它只是返回undefined
。 结果,上面的代码产生一个类名“Activate”+ undefined,“Activateundefined”。
这里认识到的重要部分是jQuery已经改变了this
绑定。 为了使用以前的this
绑定,该值必须存储在一个variables中。 存储这个名称的一个通用名称是, me
self
或最佳实践中对this
代表的实际描述。
保存绑定工作的原因是,callback的执行上下文将在执行上下文堆栈中相对于绑定值的保存位置更深,从而有权访问该存储的值。
jsFiddle演示
$('#toggleButton').click(function(){ var toggleBtn = this; //^ store this into the toggleBtn variable $("#toggleSet div").each(function(index,element){ //^ binds `this` to the current element if( element.innerHTML != "Skip" ){ //^ we could have used `this.innerHTML` here $(element).toggleClass("Activate"+$(toggleBtn).data("color")); //^ re-use the stored `this` value } }); });