ITEEDU

javascript面向对象设计-深入this关键字

函数中的this默认代表调用函数的对象,为什么说默认呢,因为可以通过call和apply设置this。

function func(){
    alert(this.toString());
}
func();//[object Window]
var obj=new function(){};
obj.f=func;
obj.f();//[object Object]

输出的是什么意思?object说明this是一个对象,Window指出this的类型是什么。

在浏览器中Window类型有一个可用实例window,window对象是浏览器javascript引擎的顶层对象。任何函数调用都是类似于obj.func()形式的,只不过当obj为顶层对象时可以不用写。所以所有全局的函数和变量都是这个对象的属性。

测试:

var testVar=’ testVar通过window调用’;
function testWindow(){
     alert(‘testWindow通过window调用’);
}
window. testWindow ();//testWindow通过window调用
alert(window. testVar);// testVar通过window调用

调用是成功的。

所以,我们定义了一个全局的变量或函数的时候,以下三种方式是相同的。

var test="Tony";
function f1(){}
//--------------------
window.test="Tony"
window.f1= function (){};
//------------------------------
window["test"]="Tony";
window["f1"]= function (){};

因此,func()调用者是window,输出[object Window];obj.f()调用者是obj,输出[object Object]。正是应了”函数中的this默认代表调用函数的对象”。

为什么不用var声明的变量为全局变量,因为有个隐藏前缀window对象。

obj={
    func:function(){
       v1='in func no var';
       var v2='in func with var';
    }
}
obj.func();
alert(obj.v1);//undefined
alert(window.v1);//in func no var
alert(obj.v2);//undefined

在对象obj的func函数中声明的变量v1因为没有添加var变成了全局变量了。

为了更好的理解”函数中的this默认代表调用函数的对象”,我们看一个闭包的例子:

var name = "The Window";
var object = {
	name : "My Object",
	doSomething : function() {
		return function() {
			return this.name;
		};
	}
};
alert(object.doSomething()());//The Window

为什么会是The Window?object.doSomething()()可以等同于

var func= object.doSomething();
func();

可以看到返回的函数会被widow对象调用,自然其中的this也是window对象了。this.name也就成了window.name了。