作为普通函数调用
当函数不作为对象的属性被调用时,也就是我们常说的普通函数方式,此时的this总是指向全局对象。在浏览器的JavaScript里,这个全局对象是window对象。
window.name = 'globalName';
var getName = function(){
return this.name;
}
console.log( getName() ); // 输出:globalName
// 或者
window.name = 'globalName';
var myObject = {
name: 'sven',
getName: function() {
return this.name;
}
}
console.log( myObject.getName() ); // 输出:globalName
有时候我们会遇到一些困扰,比如在div节点的事件函数内部,有一个局部的callback方法,callback被作为普通函数调用时,callback内部的this指向了 window,但我们往往是想让它指向该div节点,见如下代码:
<html>
<body>
<div id="div1">我是一个div</div>
</body>
<script>
window.id = 'window';
document.getElementById('div1').onClick = function(){
alert(this.id); // 输出:'div1'
var callback = function() {
alert(this.id); // 输出: 'window'
}
callback();
}
</script>
</html>
此时有一种简单的解决方案,可以用一个变量保存div节点的引用:
document.getElementById('div1').onClick = function(){
var that = this; // 保存div的引用
var callback = function() {
alert(this.id); // 输出: 'div1'
}
callback();
}
在ECMAScript5的strict模式下,这种情况下的this已经被规定为不会指向全局对象,而是undefined;
function func() {
"use strict"
alert(this.id) // 输出: undefined
}
func();