对于this,大部分人都会有一个感性的认识,this就是指对象本身的引用。在C、C++、C#这些语言中的this的含义没有太大的差别。于是乎,我们很多时候就错误的认为JavaScript的this也是如此。
事实上,当我们使用JavaScript的this时会发现情况有些不同。JavaScript会因为不同的环境上下文和调用方式其引用的对象会不断的发生改变。
Example:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn" lang="zh-cn" xmlns:qz="http://qzone.qq.com/">
<head>
<title>JS实例:JS this在不同环境上下文中的具体含义</title>
<script type="text/javascript">
var outString = "";
</script>
</head>
<body>
<h2>this在各种所处的环境下具体的含义:</h2>
1.内嵌在元素中的脚本段:this就是指元素本身
<input id="t1" type="button" value="ClickMe" οnclick="outString += '1.内嵌在元素中的脚本段:' + this + '<br />'" />
<br />
2.写在script标签中:this就是指全局对象window
<input id="t2" type="button" value="ClickMe" />
<script type="text/javascript">
var that = this;
document.getElementById("t2").onclick = function() { outString += "2.写在script标签中:" + that + "<br />"; };
</script>
<br />
3.写在function中:this就是指全局对象window
<script type="text/javascript">
(function() { outString += "3.写在function中:" + this + "<br />"; })();
</script>
<br />
4.写在function中的function中:this就是指全局对象window
<script type="text/javascript">
(function() { (function() { outString += "4.写在function中的function中:" + this + "<br />" })(); })();
</script>
<br />
5.写在一个function对象中:this就是指function对象本身<br />
5.1.写在一个function对象的构造函数中:this就是指function对象本身<br />
5.2.写在作为一个function对象的方法中:this就是指function对象本身
<script type="text/javascript">
function fn() {
outString += "5.1.写在一个function对象的构造函数中:" + this + "<br />";
}
var fnObj = new fn();
fnObj.init = function() { outString += "5.2.写在作为一个function对象的方法中:" + this + "<br />"; };
fnObj.init();
</script>
<br />
6.写在一个普通对象中:this就是指对象本身
<span id="t6"></span>
<script type="text/javascript">
var obj = document.getElementById("t6");
obj.init = function() {
outString += "6.写在一个普通对象的方法中:" + this + "<br />";
}
obj.init();
</script>
<br />
<h3> 结果:</h3>
<input id="btn_result" type="button" value="获取各种上下文环境下this" />
<div id="result">
</div>
<h3>总结:</h3>
<p>任何函数,只要该函数被当做一个对象的方法使用或赋值时,该函数内部的this都是对该对象本身的引用;否则,该对象就是对全局对象的引用</p>
</body>
</html>
<script type="text/javascript">
document.getElementById("btn_result").onclick = function() {
document.getElementById("result").innerHTML = outString;
};
</script>
一个人能做好的事情不多,有限的时间,无限的努力。