深入了解javascript第二篇 this篇
2015-07-03 11:13
489 查看
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]);
,闭包,基于原型的继承等高级功能。
在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]);
相关文章推荐
- 深入了解JavaScript
- JavaScript 函数replace深入了解
- 深入了解javascript中的prototype
- prototype.js 让你更深入的了解javascript的面向对象特性(转)
- Module模式 - 深入了解Javascript
- JavaScript DOM 对象深入了解
- prototype.js 让你更深入的了解javascript的面向对象特性
- 深入了解Javascript(图解)
- 深入了解JavaScript
- javascript深入了解(闭包)
- JavaScript深入了解。
- 深入了解JavaScript的逻辑运算符(与、或)
- 深入了解 JavaScript 中的 for 循环
- 深入了解 JavaScript 中的 for 循环
- 深入了解java和javascript-杂谈章
- 深入理解javascript作用域系列第二篇——词法作用域和动态作用域
- 代码复用 -- 深入了解javascript
- prototype.js 让你更深入的了解javascript的面向对象特性
- 深入了解javascript--立即调用的函数表达式
- 表达式函数深入了解javascript系列学习笔记(二):揭秘命名函数表达式