函数中的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了。