博客
关于我
Javascript理解this对象
阅读量:422 次
发布时间:2019-03-06

本文共 1701 字,大约阅读时间需要 5 分钟。

this是函数运行时自动生成的一个内部对象,只能在函数内部使用,但总指向调用它的对象。

通过以下几个例子加深对this的理解。

(1)作为函数调用

var name = 'Jenny';function person() {    return this.name;}console.log(person());  //Jenny

上面这个例子在全局作用域中调用person(),此时的调用对象为window,因此this指向window,在window中定义了name变量,因此this.name相当于window.name,为Jenny。

再看下面一个例子:

function a() {    function b() {        function c() {            console.log(this);        }        c();    }    b();}a();    // window

这个例子中,也同为函数调用,因此this指向window。

(2)作为对象的方法调用

var name = 'Jenny';var obj = {    name: 'Danny',    person: function() {        return this.name;    }};console.log(obj.person());  //Danny

在这个例子中,person()函数在obj对象中定义,调用时是作为obj对象的方法进行调用,因此此时的this指向obj,obj里面定义了name属性,值为Danny,因此this.name = "Danny"。

(3)作为构造函数调用

作为构造函数调用和普通函数调用的区别是,构造函数使用new关键字创建一个实例,此时this指向实例对象。

function person() {    return new person.prototype.init();}person.prototype = {    init: function() {        return this.name;    },    name: 'Brain'};console.log(person().name); //undefined

这是一个比较复杂的例子,涉及到了原型。

首先,创建构造函数person,为函数重新定义原型,在原型上定义了两个方法init和name,其中init返回this.name。

调用person函数的name属性,发现返回的是undefined,为什么不是Brain呢?

我们看,调用person,返回person.prototype.init()的一个实例,假设返回的这个实例名为a,那么此时的this指向的就是a,a作为person.prototype.init()的一个实例,那么所有定义在person.prototype.init()中的方法等都可以被a调用,但是name属性定义在person的原型中,而非init函数中,因此返回undefined。

(4)apply和call

使用apply()和call()可以改变调用函数的对象,第一个参数为改变后调用这个函数的对象,其中apply()的第二个参数为一个数组,call的第二个参数为每个参数。

function person() {    return this.name;}var obj = {    name: 'Jenny',    age: 18};console.log(person.apply(obj));  //Jenny

使用apply函数改变了调用person的对象,是在obj对象下面调用person,不再是在window对象下调用了,因此this指向obj,this.name = "Jenny";

文章标题:Javascript理解this对象

转载自https://www.cnblogs.com/nuanriqingfeng/p/5794632.html
标签:js,this对象

你可能感兴趣的文章
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>