this的指向形式和改变this指向的方式

JavaScript在函数中this指向不是定义的时候确定的,而是真正运行此函数时确定的。要想判断函数中this的指向,只要知道谁直接调用产生this指针的函数,this就指向谁了。只是要注意使用了new 操作符之后,构造函数内部的this指向的是新对象,通俗点讲就是new出来的新实例。

一、 this指向的形式

1.1 纯粹的函数调用
函数的最通常用法,属于全局性调用,this指向全局对象window

var temp = 1;
function test1() {
   console.log(this.temp);
}
test1();  // 1

1.2在严格模式下”use strict”,为undefined

"use strict";
var temp = 1;
function test2() {
   console.log(this.temp);
}
test2();  // undefined

1.3对象的方法里调用,this指向调用该方法的对象

function test3() {
  console.log(this.temp);
}

var obj = {};
obj.temp = 1;
obj.x = test3;

obj.x(); // 1

1.4 构造函数里的this,指向创建出来的实例

通过构造函数,可以生成一个新对象。this就指这个新对象。

function test4() {
 this.x = 1;
}

var obj = new test4();
obj.x // 1

二、 改变this指向的方式

2.1 call()函数
例: 被调函数名.call(param1,param2,param3);

定义:call()是函数的一个方法,作用是改变函数的调用对象。
第一个参数就表示改变后的调用这个函数的对象。第二个参数开始都是函数实际参数
因此,这时this指的就是这第一个参数。

(function() {
                alert(this);
            }).call("js is amazing");

2.2 apply()函数:
例: 被调函数名.apply(param1, param2);

定义:apply()是函数的一个方法,作用是改变函数的调用对象。
第一个参数就表示改变后的调用这个函数的对象。第二个参数是一个集合
因此,这时this指的就是这第一个参数。

var x = 0;
function test() {
 console.log(this.x);
}

var obj = {};
obj.x = 1;
obj.temp = test;
obj.temp.apply() // 0
//obj.temp.apply(obj); //1

apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。

如果调用最后一行代码,运行结果就变成了1,证明了这时this代表的是对象obj

2.3 bind()函数
例:.bind() bind(thisScope, arg1, arg2…)

定义:bind()方法会创建一个新的函数,称为绑定函数,方法在this环境下调用。该方法可传入两个参数
第一个参数作为this,第二个及以后的参数则作为函数的参数调用

var name = "Linus";
            var person = {
                name:"geekfanr",
                age:22,
                say:function(){
                    alert(this.name);
                    setTimeout(function(){
                        alert(this.name);
                    }.bind(this),1000);
                }
            }
            person.say();//geekfanr twice

bind改变this指向后,返回的是函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客范儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值