深入了解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]);
,闭包,基于原型的继承等高级功能。
在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
- 深入了解javascript第二篇 this篇
- 深入了解javascript第一篇实现篇
- 深入了解JavaScript
- 深入了解Javascript(图解)
- javascript深入了解文章
- javascript深入了解(四)
- JavaScript this 深入理解
- Javascript 深入了解Javascript 基础知识
- 深入浅出了解 JavaScript 中的 this
- javascript深入了解(继承)
- 深入了解javascript中的prototype
- 深入了解JavaScript之变量
- 深入了解JavaScript编程语言
- 深入理解javascript之this
- 深入理解javascript关键字this
- Javascript深入理解之this
- 深入理解JavaScript中的this
- 再也不用担心javascript的this---从代码去理解(第二篇)---引用类型
- 【移动开发者沙龙 北京站】第二期 报名火热来袭
- 开源性能测试工具Apache ab使用
- Javascript模块化编程(二):AMD规范
- 为抢占印度市场:阿里多线并行祭出“组合拳”
- mysql安装及主从配置
- 深入了解javascript第二篇 this篇
- 安装软件:/lib/ld-linux.so.2: bad ELF interpreter解决
- 【Leetcode Algorithm】Count and Say
- Javascript模块化编程(三):require.js的用法
- Linux的SOCKET编程详解
- iOS RunLoop 初识
- 《C语言及程序设计》程序阅读——条件编译
- drools的JavaDialect异常
- 正则表达式 获取开头结尾的数字