| 系统系 | - 操作系统 - 工具软件 - 病毒安全 - Vista专区 | WEB2.0 | - 奇趣 - 发现分享 - 评论员文章 - 沈阳网站制作 | 视 频 | - 体育 - 娱乐 - 科技 - 教程 |
| 办公系 | - Word - Excel - Powerpoint - 圣诞祝福 | 动画系 | - Flash - Ascript - Flex - MsE Design 教程 | 编程系 | - Asp - Asp.Net - Php - Jsp、Java - CGI/perl |
| 艺术系 | - 酷赏 - 工业 - 建筑 - 界面 - 平面 - 视觉 | 网站系 | - HTML/Xhtml - Js、Ajax - Css - XML、XSLT | 下 载 | - 图形图像 - 多媒体 - 系统办公 |
this? 那是虾米?
每一个运行上下文除了建立一个作用域链外,还峁┮桓雒猼his的关键字。它的普遍用法是,this作为一个独特的功能,为邻里们提供一个可访问到它的途径。但总是依赖于这个行为并不可靠:取决于我们如何进入一个特定邻居的具体情况,this表示的完全可能是其他东西。事实上,我们如何进去邻居家本身,通常恰恰就是this所指。有四种情形值得特别注意:
<script type="text/javascript">
var deep_thought = {
the_answer: 42,
ask_question: function () {
return this.the_answer;
}
};
var the_meaning = deep_thought.ask_question();
</script>
这个例子建立了一个名为deep_thought的对象,设置其属性 the_answer为42,并创建了一个名为ask_question 的方法(method)。当deep_thought.ask_question()执行时, JavaScript为函数的呼叫建立了一个运行上下文,通过”.“运算符把this指向被引用的对象,在此是deep_thought这个对象。之后这个方法就可以通过this在镜子中找到它自身的属性,返回保存在 this.the_answer中的值:42。
<script type="text/javascript">
function BigComputer(answer) {
this.the_answer = answer;
this.ask_question = function () {
return this.the_answer;
}
}
var deep_thought = new BigComputer(42);
var the_meaning = deep_thought.ask_question();
</script>
我们编写一个函数来创建BigComputer对象,而不是直白地创建 deep_thought对象,并通过new关键字实例化deep_thought为一个实例变量。当new BigComputer()被执行,后台透明地创建了一个崭新的对象。呼叫BigComputer后,它的this关键字被设置为指向新对象的引用。这个函数可以在this上设置属性和方法,最终它会在BigComputer执行后透明地返回。
尽管如此,需要注意的是,那个deep_thought.the_question()依然可以像从前一样执行。那这里发生了什么事?为何this在the_question内与BigComputer内会有所不同?简单地说,我们是通过new进入BigComputer的,所以this表示“新(new)的对象”。在另一方面,我们通过 deep_thought进入the_question,所以当我们执行该方法时,this表示 “deep_thought所引用的对象”。this并不像其他的变量一样从作用域链中读取,而是在上下文的基础上,在上下文中重置。
<script type="text/javascript">
function click_handler() {
alert(this); // 弹出按钮的DOM节点
}
function addhandler() {
document.getElementById('thebutton').onclick = click_handler;
}
window.onload = addhandler;
</script>
...
<button id='thebutton'>Click me!</button>