JS笔记-this的各种用法

来源:互联网 发布:linux终端 java安装 编辑:程序博客网 时间:2024/05/16 13:39

在面向对象编程语言中,在就出现了this对象。在Javascript中,也有this对象,但情况就相比复杂多了。

一般地说,this对象引用的是函数据以执行的环境对象。

坊间传言:this就是指向最近的对象。谁是对象而且离this最近,this就指向谁。这个是很表层的说法。

而深层的说法,指的是:this指针代表的是执行当前代码的对象的持有者。

比如以下代码:

var hi = "I am window";        function sayHi(){            var hi = "I am sayHi";            alert(this.hi);        }sayHi();



或者大家会以为结果是I am sayHi。但是实际上是I am window,意味着this指向的是window对象。

我认为大家先要了解什么叫做环境对象。在我的理解里,环境对象指的是:在a环境下执行函数,a即为函数的环境对象。上面sayHi函数,实际上是在window对象中执行的,因此this调用的也是window对象中的变量hi。

在下面的情况下,this的指向就变了。

var hi = "I am window";        function sayHi(){            var hi = "I am sayHi";            alert(this.hi);        }        var o = { hi : "I am O" };        o.sayHi = sayHi;        o.sayHi();        sayHi(); 
这里的结果是I am O。


实际上我们可以这样理解:在前一段代码中,执行sayHi()的时候,其实JS内部解释的时候有我们尚未加上的前缀window.。完整的调用应该是:window.sayHi();而第二段代码中则是o.sayHi()。this对象可以说就是指向调用该函数的那个对象,即window和O。

P.S.:在调用this时,并不能认为函数也是一个对象。函数对象并不能在this中占有一席的位置,大家请看下面的代码:

        var hi = "I am window";        function sayHi(){            var hi = "I am sayHi";            function sayHello(){                alert(this.hi);            }            sayHello();        }        sayHi();

这里的运行结果是:I am window。但是sayHello()是在sayHi()里面执行的啊。大家可以这样想,我们能在JS里用形似sayHi.sayHello()这样的语法吗?答案是不可以的。因此,sayHi在这里也就不算是一个可以被this指向的对象。



0 0