js函数的执行环境

     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的执行环境了。

posted @ 2015-08-26 16:24  carrot_hlb  阅读(500)  评论(0编辑  收藏  举报