对javascript中的“this”关键字感到困惑-堆栈溢出 最近30次来自stackoverflow.com 2024-09-21T18:25:21Z https://stackoverflow.com/feeds/question/12608807 https://creativecommons.org/licenses/by-sa/4.0/rdf https://stackoverflow.com/q/12608807 4 对javascript中的“this”关键字感到困惑 贾斯廷 https://stackoverflow.com/users/888617 2012年9月26日上午9:14:26 2012年9月26日上午9点34分29秒 <p>我已经很长时间没有使用Javascript了,今天我一直在刷新它。一直让我感动的是<code>this</code>关键字。我知道在jQuery事件处理程序中,例如click事件,<code>这个</code>引用了触发事件的元素。即使我的函数没有参数,这个</code>如何传递给我作为回调函数的函数</p>(第页)<p>给定以下代码:</p><pre><code>$(“tr.SummaryTbRow”).data(“动画”,false);$(“tr.SummaryTbAltRow”).data(“动画”,false);$(“tr.SummaryTbRow”).单击(函数(){if($(this).data(“动画”)==false){if($(this).next(“.Graph”).css(“display”)==“none”){$(this).data(“动画”,true);//第二部分我提出质疑。setTimeout(函数(){$(this).data(“动画”,false);}(本条)第550条;$(this).next(“.Graph”).slideRow(“向下”,500);}其他{$(this).data(“动画”,true);$(this).next(“.Graph”).slideRow('up',500);}}});</code></pre><p>我试图找出如何将类<code>SummaryTbRow</code>的元素表行传递给setTimeout回调函数。jQuery传递<code>这个</code>的方式是否与我使用匿名回调函数的方式类似?函数中我的<code>这个</code>是否引用了我传入的这个<code>this</p>(第页)<p>我知道我可以:</p><pre><code>setTimeout(函数(元素){$(element).data(“动画”,false);}(本条)第550条;</code></pre><p>但我想知道jQuery如何将这个<code>this</code>传递给我的回调函数,即使我的函数有0个参数</p>(第页) https://stackoverflow.com/questions/12608807/-/12608831#12608831 Denys Séguret对javascript中“this”关键字困惑的回答 丹尼斯·塞古雷特 https://stackoverflow.com/users/263525 2012年9月26日T19:16:18Z 2012年9月26日T19:22:03Z <p>要回答最后一个问题,可以使用for example将您选择的接收器传递给javascript中的函数https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call“rel=”nofollow“>呼叫:</p><pre><code>someFunction.call(someObject);</code></pre><p>在<code>someFunction内部,这个</code>将是<code>someObject</p>(第页)<p>就你而言,你似乎想要的是</p><pre><code>setTimeout(函数(元素){$(element).data(“动画”,false);},550,本);//这将作为元素传递给回调</code></pre><p>或(<a href=“https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout网站“rel=”nofollow“>更加兼容</p><pre><code>var_this=this;setTimeout(函数(){$(_this).data(“动画”,false);}, 550); </code></pre> https://stackoverflow.com/questions/12608807/-/12608834#12608834 1 Michael Mior对javascript中“this”关键字的困惑的回答 迈克尔·缪尔 https://stackoverflow.com/users/123695 2012年9月26日T19:16:34Z 2012年9月26日T19:16:34Z <p>您可以使用<a href=“https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call开发人员“rel=”nofollow“><code>fn。调用</code></a>或<a href=”https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply“rel=”nofollow“><code>fn.apply</code></a>这两个函数都有一个上下文参数,用于<code>这个</code></p> https://stackoverflow.com/questions/12608807/-/12608838#12608838 2 Pete对javascript中“this”关键字的困惑回答 皮特 https://stackoverflow.com/users/1649781 2012年9月26日T19:16:45Z 2012年9月26日T19:34:29Z <p>简短回答:</p><p>通过使用函数的<code>.call()</code>和<code>.apply()<-code>方法,可以在函数上设置<code>0.05</p>(第页)<p>详细答案:</p><p>任何函数上的<code>this</code>变量都类似于<code>参数</code>variable(这可能是您不知道的)。它是在调用函数时设置的,是函数调用方式的工件。为了进行解释,我首先演示<code>参数</code>。考虑:</p><pre><code>myFunction=函数(){返回参数.length;};</code></pre><p>现在,让我们看几个对<code>myFunction的调用:</p><pre><code>myFunction()//是0myFunction(空)//是1myFunction(未定义)//是1myFunction(0,0,00,0)//是5</code></pre><p>如您所见,<code>arguments.length</code>的值并不取决于我们如何或在何处编写函数,而是取决于我们调用函数的方式。<code>this</code>变量(也称为“调用对象”)也是如此。设置调用对象的方法只有三种(ES5中有第四种,但我们将忽略这一点):</p><ol><li>您可以通过使用点表示调用函数来设置它(例如<code>something.myFunction()</code>)</li><li>您可以通过使用函数的<code>.call()</li><li>如果未使用方法#1或#2进行设置,它将默认为全局对象(例如<code>窗口</code>)</li></ol><p>所以大多数人都习惯了第一种方法。如果将函数指定为对象的属性,然后使用对象和点表示调用该函数,则对象将设置为<code>this</code>。像这样:</p><pre><code>varmyFn=(function(){return this.x});var myObj={x: 1、,y: 我的Fn};myObj.myFn()//是1</code></pre><p>但是,如果<code>myFn</code>不是我们要调用的对象的属性,但该对象遵循<code>myFn的正确形式才能对其进行操作,那么我们也可以使用方法2(请参见:duck typeing):</p><pre><code>var myOtherObj={x: 2个}myFn.call(myOtherObj)//是2myFn.apply(myOtherObj)//是2myFn.apply({x:3})//是3</code></pre><p>很酷,嗯?jQuery就是这样做的。当他们执行回调时,他们使用<code>.apply(event.target)</code>(将<code>This</code>设置为事件的目标对象)。他们以更复杂的方式进行这项工作,因为他们的<code>回调</code>框架,<a href=“https://github.com/jquery/jquery/blob/master/src/callbacks.js#L68“rel=”nofollow“>但想法确实存在</p><p>无论如何,如果我不解释一下方法#3,我不会给出一个很长的答案,因为它会让一些人发疯:如果你不设置调用对象,会发生什么</p>(第页)<p>因为所有全局变量都是全局对象的隐式属性,所以您可以从方法#3中获得一些有趣的效果。例如:</p><pre><code>var x=4;myFn()//是4</code></pre><p>但大多数时候,你没有足够的运气让全局对象满足函数对其调用对象的要求,所以通常这只会导致错误和很多挫折</p>(第页)<p>可能比您想要的要多,但希望您现在对调用对象及其狡猾的方式有了更多的了解</p>(第页) https://stackoverflow.com/questions/12608807/-/12608861#12608861 0 sheerun对javascript中“this”关键字的困惑回答 羊皮绒 https://stackoverflow.com/users/383214 2012年9月26日T19:18:42 Z 2012年9月26日T19:18:42 Z <p><a href=“https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply“rel=”nofollow“>应用,<a href=”https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call“rel=”nofollow“>呼叫</a>和<a href=”https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind“rel=”nofollow“>bind</a>方法就是为了这个目的。在您的案例中,您只需写下:</p><pre><code>setTimeout(函数(){$(this).data(“动画”,false);}.绑定(this),550);</code></pre>