this 作为普通函数调用

0 阅读1分钟

作为普通函数调用

当函数不作为对象的属性被调用时,也就是我们常说的普通函数方式,此时的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();
  }

ECMAScript5strict模式下,这种情况下的this已经被规定为不会指向全局对象,而是undefined;

function func() {
  "use strict"
  alert(this.id) // 输出: undefined
}
func();