JavaScript中this关键字的使用比较

JavaScript中this关键字的使用比较

this关键字在JavaScript中,用的不能说比较多,而是非常多。那么熟悉this关键字的各种用法则显得非常关键。

this有时候就是我们经常说的上下文,这个东西的指代对象。它灵活多变,有时候你看它是对象,有时候是window宿主对象。

1.this指向宿主对象

function myWindow() {
    this.id = 1; // 等价于window.id = 1
    console.log(this); // 这里的this就是window了
    console.log(this.id); // 1
}
myWindow();

这种情况比较普遍,也就是指向宿主对象的情况,在客户端是 window对象 在node里是 Global对象 第一个说,下面看第二种。

2.this指向调用函数的对象的时候

function myObj() {
    console.log(this.x); // 在这个例子里面是obj对象
}
var obj = {};
obj.x = "xx";
obj.myObj = myObj;
obj.myObj(); // xx

这里的myObj()函数里面的 this 指向的就是obj这个外部传递来的对象了。注意看 obj.myObj() 这里前面的 obj. 这里,因为myObj是obj这个对象的方法,下面obj作为对象调用了myObj这个函数,所以这里的this就是指向调用函数的对象了。

3.this指向构造函数生成的新对象的时候

// 作为构造函数的函数记得首字母要大写
function People(gender) {
    this.gender = gender;
    this.sayGender = function() {
        console.log(this.gender);
    }
}

// 输出man,函数this是新的People{}对象
var girl = new People("women"); 

// 输出women,函数this是指向girl{gender:"women"}对象
girl.sayGender();

这里的执行过程理一下,首先 new People("man") 这句做了几件事情:

  1. 根据构造函数创建一个空的对象People{}
  2. 然后传递到People里面(这里才叫开始构造的过程,添砖加瓦的意思)
  3. 然后这里开始的函数里面的this就是指向传进来新的People{}对象了

这里就是构造函数生成对象的一个简单的过程了,可以自己模拟着执行以下。

4.this指向需要继承属性的对象的时候(apply和call)

function People(gender) {
    this.gender = gender;
    this.sayGender = function() {
        console.log(this.gender);
    }
}

var sally = new People("women");

var bob = { // bob是直接量创建的,但是没有sayGender方法可以用
    gender: "man";
}

所以这里如果bob要用 sayGender() 方法的话要怎么破呢?这个时候就要用到 apply() 或者 call() 了,这两个方法差不多。

  • apply(obj, arguments) 这里的arguments是一个参数数组
  • call(obj,argument) 这里没有复数

所以bob要调用 sayGender() 的话,就要用到 call() 方法或者 apply() 方法了。

这个其实可以理解为继承的一种,Java里面继承分为实现继承跟接口继承两种,JavaScript的继承是只有实现继承的,但是实现继承JavaScript里面又有很多种,比如原型链继承,还有这里的 apply()call() 也算是继承的一种。

function People(gender) {
    this.gender = gender;
    this.sayGender = function(str) {
        console.log(this.gender);
    }
}

var sally = new People("women");

var bob = { // bob是直接量创建的,但是没有sayGender方法可以用
    gender: "man";
}

sally.sayGender("这是什么性别的?"); // 这是什么性别的?women
sally.sayGender.call(bob,"这是什么性别的?"); // 这是什么性别的?man

这里最后一句代码的执行过程分析下:

  1. 将bob{gender: “man”}这个对象传递到People里面
  2. 更改函数里面this指向
  3. 继续执行函数里面其他代码

这里可以看出,bob这个对象继承要继承另外一个对象的某个方法的时候可以用上面这种写法 function.call(obj, argument)

同时也可以知道,this在函数里面的指向其实是可以有很多种的,要根据不同的环境来判断。

下面开始apply的例子,在开始 apply() 的例子之前先普及一下基本知识:

首先普及下一个概念 类数组(array-like) ,类数组其实我们平时接触的很多的。比如函数里面的 arguments对象 ,注意这里说的是 arguments对象 而不是 arguments数组 。因为arguments不是一个数组而是一个对象,只是我们平时用的时候喜欢用 arguments[0] 这样的写法所以看起来像数组而已。类数组通常的定义就是 有维护一个length属性可以根据数字下标来获取元素 比如 arguments[0] 这样的一个对象。

不信的话我们可以测试下的:

function arrayLike() {
    console.log(arguments instaceof Array); // false
    console.log(arguments instaceof Object); // true
}
arrayLike();

其实JavaScript里面的数组对象叫 关联数组 ,也就是我们数据库表那样的 键-值对 组成的形式。所以你如果以为JavaScript可以像其他语言那样优化循环比如 for(var i=0; i<100; i++) 这样的过程的话你就想多了。
甚至,JavaScript的对象内部实现也是
关联数组
,比如你可以定义键为0而值为其他的对象。

var obj = {
    0: "12345"
}
var arr = ["12345"];
console.log(obj[0]); // 12345
console.log(arr[0]); // 12345

有没有觉得JavaScript内部的实现其实很简单?或者可以说原理基本上就一个,但是通过简单的加点属性减点属性让对象跟数组看起来完全不一样。其实内部的实现原理是一模一样的。

废话扯得有点多,下面看 apply() 方法的例子:

function People(gender) {
    this.gender = gender;
    this.sayGender = function() {
        var str = Array.prototype.join.call(arguments,""); // arguments为类数组
        console.log(str + this.gender); //
    }
}

var sally = new People("women");

var bob = {
    gender: "man"
}

var textArr = "这是什么性别的?".split(""); // 这里将字符串分割为数组

sally.sayGender.apply(bob, textArr); // 这是什么性别的?man

大概就到这里吧,有兴趣的可以留言讨论下。

时间: 2024-10-31 14:47:04

JavaScript中this关键字的使用比较的相关文章

Javascript中的关键字和保留字

ECMA-262中描述了一组具有特定用途的关键字,可用于表示控制语句的开始或结束,或者用于执行特定操作等.规定:关键字属于语言保留,不可以用于标示符. ECMAScript的全部关键字(*为第五版新增): break do instanceof typeof case else new var catch finally return void continue for switch while debugger*   function this with default if throw de

深入解析Javascript中this关键字的使用

深入解析Javascript中面向对象编程中的this关键字 在Javascript中this关键字代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如: function TestFunction(){ this.demoVal='This is a demo variable'; }; 随着函数使用的场合不同,this的值会发生改变.但是有一个总的原则:this指的是调用函数的那个对象. 接下来分情况讨论this关键字的使用: 1. 纯粹的函数调用(这是函数的通常用法,属于全局性

Javascript中this关键字详解

原文出处:http://www.cnblogs.com/justany/archive/2012/11/01/the_keyword_this_in_javascript.html Quiz 请看下面的代码,最后alert出来的是什么呢? 1 var name = "Bob"; 2 var nameObj ={ 3 name : "Tom", 4 showName : function(){ 5 alert(this.name); 6 }, 7 waitShowNa

JavaScript中var关键字的使用详解

作用 声明作用:如声明个变量. 语法 ? 1 var c = 1; 省略var 在javascript中,若省略var关键字而直接赋值,那么这个变量为全局变量,哪怕是在function里定义的. ? 1 2 3 4 5 6 7 8 <script type="text/javascript">   function Define() {     a = 2;   }   function Hello() {     alert(a);   } </script>

JavaScript中this关键字的理解

this是个什么鬼? this是JavaScript中的一个关键字,代表当前对象. this在那些情况下会指向谁?如下文. 一.调用全局变量(Global Variable) var x="我是全局变量呦"; function obj() { alert(this.x); } obj(); //我是全局变量呦 此时,this指向了全局变量x. 二.将this作为对象的方法来调用. function test() { alert(this.x); } var obj={}; obj.x=

javascript中this关键字之我见

javascript中的this关键字是个很令人头疼的问题,学习的时候也是个难点,觉得这个东西很玄乎,很乱: 下面是我个人的一点观点: 首先我们来看看直接定义的全局函数: function introduce() {      alert("Hello, I am limeng"); } 这个函数的this指向谁呢? 定义在全局的函数,其实也就是window对象的一个方法,函数的所有者就是当前页面,也就是window对象,我们alert一下看看: var name = "He

深入了解JavaScript中的关键字

this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用,下面分四种情况,详细讨论this的用法,感兴趣的朋友可以了解下. this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, 复制代码代码如下: function test(){ this.x = 1; } 随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 下面分四种情

对于JavaScript中this关键字的理解

这是我第二遍学this了,第一遍学的懵懵的.this指哪里都是凭我一个男人的直觉然后控制台输出看看对不对. 刚查了书.博客.视频.理解差不多了.毕竟菜鸡me: 一.首先介绍下什么是this this是一个标识符,它需要和值进行绑定,和变量差不多:但是在你的代码中,它不是和某个具体的值进行绑定.而是绑定到正确的对象上,一般来说参数究竟绑定在哪个对象上都是由定位函数参数规则所决定的. 二.this对象是在运行时基于函数的执行环境绑定的,当函数被作为某个对象的方法调用时,this等于那个对象. 代码一

javascript中this关键字的应用

(1).作为对象方法调用.this 被自然绑定到该对象. (2).作为函数调用.函数也可以直接被调用,此时 this 绑定到全局对象.对于内部函数,这种绑定到全局对象的方式会产生另外一个问题,内部函数的 this 应该绑定到其外层函数对应的对象上,那么用就变量替代的方法,将this保存在一个变量中,该变量一般被命名为 that. (3).作为构造函数调用.this 绑定到新创建的对象上. (4).使用 apply 或 call 调用.This可以替换对象.