js的函数本质上是一种对象,是对象就会有自己的环境(作用域),看下面的例子
var var1 = { message: "var1", getMessage: function () { alert(this.message); } }; var var2 = { message: "var2", getMessage:var1.getVar1 }; var2.getMessage();
这段代码会输出 "var2"。不对啊,应该是输出"var1"啊,但是这里确实应该输出"var2",不信你自己实验。
这就是函数体中的this在起作用,var2的函数getMessage指向的是var1的函数,而函数其实就是一段放在内存中的代码,执行var1.getMessage()时,this指向的就是var1,输出也就是“var1”了。执行var2.getMessage()时自然就输出"var2"了。如果改成是下面这样
var var1 = { message: "var1", getMessage: function () { alert(this.message); } }; var var2 = { message: "var2", getMessage:function(){ var1.getMessage(); } }; var2.getMessage();
输出就会是"var1"了。看出两段代码有什么区别了吗?区别就在第二段代码给var2重新指定了一个函数,只不过这个新函数中执行了var1的函数。
this指向的就是函数的执行环境,在第一段代码中,其实就是把var1的函数的代码复制给了var2的函数,所以var2的函数在内存中编译后(浏览器解释js代码时就会把代码编译成机器码放在内存中)的代码是这样的:alert(this.message),this指向的是var2,所以会输出"var2"。第二段代码中,var2的函数没有自己的代码,它只是定义了一个指针指向了var1的函数代码,所以执行的其实就是var1的函数代码,this自然指向的就是var1的执行环境了。
时间: 2024-10-12 16:18:19