深入了解javascript第二篇 this篇

来源:互联网 发布:淘宝客服设置分流 编辑:程序博客网 时间:2024/05/22 11:53
JavaScript是一种脚本语言,因此被很多人认为是简单易学的。然而情况恰恰相反,Javascript支持函数式编程
,闭包,基于原型的继承等高级功能。


在java等面向对象的语言中,this关键字的含义是明确且具体的,即指代当前对象。一般在编译期就确定下来,或者
称为编译期绑定。而在javascript中,this是动态绑定,或称为运动期绑定的,这就导致Javascript中的this关键字
有能力具备多重含义,带来灵活性的同时,也为初学者带来不少困惑。


可以这样说,正确掌握了Javascript中的this关键字,才算买迈入了Javascript这门语言的门槛。

Javascript中的this含义丰富得多,它可以是全局变量、当前对象或者任意对象,这个完全取决于函数的调用方式。
Javascript中函数的调用有已下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用apply或
call调用。下面我们调用方式不同,分别讨论this的含义。

作为对象方法调用
在javascript中,函数也是对象,因此函数可以作为一个对象的属性,此时该函数称为该对象的方法,在使用这个
调用的方式时,this被自然绑定到改对象中。

var person = {
  name:'女神',
  age:18,
  introduce:function(){
     console.log("我的名字是"+this.name);
     console.log("今年妙龄"+this.age);
  }

}
person.introduce();//this绑定person这个对象中


作为函数调用
函数也可以直接被调用,此时this绑定到全局对象。在浏览器中,window就是全局对象。比如下面的例子:
函数被调用时,this被绑定到全局对象,接下来执行赋值语句,相当于隐式的声明了一个全局变量,这个
显然不是调用者希望的。
 var point = {
 x : 0,
 y : 0,
 moveTo : function(x, y) {
     // 内部函数
     var moveX = function(x) {
     this.x = x;//this 绑定到了哪里?
    };
    // 内部函数
    var moveY = function(y) {
    this.y = y;//this 绑定到了哪里?
    };

    moveX(x);
    moveY(y);
    }
 };
 point.moveTo(1, 1);
 console.log(point.x); //==>0
 console.log(point.y); //==>0
 console.log(x); //==>1
 console.log(y); //==>1

再看一个例子
var myObject = {value: 100};
myObject.getValue = function () {
  var foo = function () {
    console.log(this.value) // => undefined
    console.log(this);// 输出全局对象 global
 };
 
 foo();
 
 return this.value;
};
 
console.log(myObject.getValue()); // => 100

foo 函数虽然定义在 getValue 的函数体内,但实际上它既不属于 getValue 也不属于 myObject。
foo 并没有被绑定在任何对象上,所以当调用时,它的 this 指针指向了全局对象 global。


构造函数中的this指向新的对象

JavaScript 支持面向对象式编程,与主流的面向对象式编程语言不同,JavaScript 并没有类(class)的概念,
而是使用基于原型(prototype)的继承方式。相应的,JavaScript 中的构造函数也很特殊,如果不使用 new 调用,
则和普通函数一样。作为又一项约定俗成的准则,构造函数以大写字母开头,提醒调用者使用正确的方式调用。
如果调用正确,this 绑定到新创建的对象上。
var SomeClass = function(){
 this.value = 100;
}
 
var myCreate = new SomeClass();
 
console.log(myCreate.value); // 输出100

使用apply或者calll调用
让我们再一次重申,在 JavaScript 中函数也是对象,对象则有方法,apply 和 call 就是函数对象的方法。这两个方法异常强大,他们允许切换函数执行的上下文环境(context

),即 this 绑定的对象。很多 JavaScript 中的技巧以及类库都用到了该方法。让我们看一个具体的例子:

function Point(x, y){
    this.x = x;
    this.y = y;
    this.moveTo = function(x, y){
        this.x = x;
        this.y = y;
    }
 }

 var p1 = new Point(0, 0);
 var p2 = {x: 0, y: 0};
 p1.moveTo(1, 1);
 p1.moveTo.apply(p2, [10, 10]);
0 0
原创粉丝点击