[此处](http://bjorn.tipling.com/all-thes)是“JavaScript”中“this”的一个很好的来源。总结如下:-**全局此**在浏览器中,在全局范围内,“this”是“window”对象<script type=“text/javascript”>console.log(这个===窗口);//真的var foo=“bar”;console.log(this.foo);//“酒吧”console.log(window.foo);//“酒吧”</script>在使用repl的`node`中,`this`是顶级命名空间。您可以将其称为“global”。>这个{ArrayBuffer:[函数:ArrayBuffer],Int8Array:{[函数:Int8Array]BYTES_PER_ELEMENT:1},Uint8Array:{[函数:Uint8Array]BYTES_PER_ELEMENT:1},...>全局===此真的在从脚本执行的“node”中,全局范围内的“this”以空对象开始。它与“global”不同`\\测试.jsconsole.log(this);\\{}console.log(这===全局);\\法斯莱-**执行此操作**除非是DOM事件处理程序或提供了“thisArg”(请参阅下文),否则在节点和浏览器中,在未使用“new”调用的函数中使用“this”都会引用全局范围…<script type=“text/javascript”>foo=“bar”;函数testThis(){this.foo=“foo”;}console.log(this.foo)//日志“栏”testThis();console.log(this.foo)//日志“foo”</script>如果使用“use strict;”,在这种情况下,“this”将“undefined”`<script type=“text/javascript”>foo=“bar”;函数testThis(){“使用严格”;this.foo=“foo”;}console.log(this.foo)//日志“栏”测试This()//Uncaught TypeError:无法设置未定义的属性“foo”</script>如果使用“new”调用函数,则“this”将是一个新上下文,它不会引用全局“this“。<script type=“text/javascript”>foo=“bar”;函数testThis(){this.foo=“foo”;}console.log(this.foo)//日志“栏”新测试This();console.log(this.foo)//日志“栏”console.log(新testThis().foo)//日志“foo”</script>-**原型**您创建的函数将成为函数对象。它们会自动获得一个特殊的“prototype”属性,您可以为其赋值。当您通过使用“new”调用函数来创建实例时,您可以访问分配给“protocol”属性的值。您可以使用“this”访问这些值。函数Thing(){console.log(this.foo);}Thing.prototype.foo=“bar”;var thing=新事物()//日志“栏”console.log(thing.foo)//日志“栏”在“prototype”上指定_arrays_或_objects_通常是错误的。如果希望每个实例都有自己的数组,请在函数中创建它们,而不是在原型中创建它们。函数Thing(){this.things=[];}var thing1=新事物();var thing2=新事物();thing1.things.push(“foo”);console.log(thing1.things)//日志[“foo”]console.log(thing2.things)//日志[]-**反对此**您可以在对象的任何函数中使用“this”来引用该对象的其他属性。这与使用“new”创建的实例不同。var对象={foo:“bar”,logFoo:函数(){console.log(this.foo);}};obj.logFoo()//日志“栏”-**DOM事件this**在HTMLDOM事件处理程序中,“this”总是对事件附加到的DOM元素的引用函数Listener(){document.getElementById(“foo”).addEventListener(“点击”,this.handleClick);}Listener.prototype.handleClick=函数(事件){console.log(this)//日志“<div id=”foo“></div>”}var listener=新监听器();document.getElementById(“foo”).click();除非你“绑定”上下文函数Listener(){document.getElementById(“foo”).addEventListener(“点击”,this.handleClick.bind(this));}Listener.prototype.handleClick=函数(事件){console.log(this)//日志侦听器{handleClick:function}}var listener=新监听器();document.getElementById(“foo”).click();-**HTML此**在可以放置JavaScript的HTML属性中,`this`是对元素的引用。<div id=“foo”onclick=“console.log(this);”></div><script type=“text/javascript”>document.getElementById(“foo”).click()//日志<div id=“foo”。。。</script>-**评估这个**您可以使用“eval”访问“this”。函数Thing(){}Thing.prototype.foo=“bar”;Thing.prototype.logFoo=函数(){eval(“console.log(this.foo)”)//日志“栏”}var thing=新事物();thing.logFoo();-**用这个**您可以使用“with”将“this”添加到当前作用域中,以读取和写入“this`”上的值,而无需显式引用“this'”。函数Thing(){}Thing.prototype.foo=“bar”;Thing.prototype.logFoo=函数(){用(这个){console.log(foo);foo=“foo”;}}var thing=新事物();thing.logFoo();//日志“栏”console.log(thing.foo);//日志“foo”-**j查询此**jQuery在许多地方都会将`this`引用到DOM元素。<div class=“foo bar1”><div class=“foo bar2”><script type=“text/javascript”>$(“.foo”).each(函数(){console.log(this)//logs<div class=“foo。。。});$(“.foo”).on(“单击”,函数(){console.log(this)//logs<div class=“foo。。。});$(“.foo”).each(函数(){this.click();});</script>