JS中----this的指向和如何修改this的指向

this

this是js中的一个关键字,函数运行时自动生成的一个内部对象,只能在函数内部使用。我们要讨论的是 this 的指向。

this就是函数运行时自动生成的一个内部对象

下面介绍一下几种情况下,this的指向

1、全局环境

全局环境下,this就代表window对象。(针对web 应用来讲)

var name = ‘zhar‘;
function say(){
  console.log(this.name);//zhar
}
say();

同样,在 setTimeout 或 setInterval 这样的延时函数中调用也属于全局对象。

var name = ‘zhar‘;
setTimeout(function(){
  console.log(this.name);//zhar
},0);

2、对象环境

对象环境指向对象。

var obj = {
  name : "zhar",
  say : function(){
    console.log(this.name);//zhar
  }
}
obj.say();

下面举两个经典的例子:

var name = ‘tom‘;
var obj = {
  name : "zhar",
  say : function(){
    console.log(this.name);
  }
}
var fun = obj.say;
fun();//输出 ?//tom-->fun定义在全局环境下,即window.fun()
//再次说明了this的指向是由运行时的执行环境来决定的
var name = ‘tom‘;
var obj = {
  name : "zhar",
  say : function(){
    return function(){
      console.log(this.name);
    }
  }
}
obj.say()();//输出 ?//tom

3、构造函数环境

构造函数中的this 会指向创建出来的实例对象,使用new 调用构造函数时,会先创建出一个空对象,然后用call函数把构造函数中的this指针修改为指向这个空对象。执行完环境后,空对象也就有了相关的属性,然后将对象返回出去,所以说就不用我们自己手动返回啦~

function Person() {
    this.name = ‘zhar‘;
}
var p = new Person();
console.log(p.name);

综合以上,构造函数不需要返回值,如果我们指定一个返回值时,this的指向将发生变化

function Person() {
  this.name = ‘zhar‘;
  return {};
}
var p = new Person();
console.log(p.name);//undefined
//--------------------------------------
function Person() {
  this.name = ‘zhar‘;
  return {name:‘tom‘};
}
var p = new Person();
console.log(p.name);//tom      如果构造函数返回对象(Object,Array,Function),那 this 将指向这个对象,其它基础类型则不受影响
//--------------------------------------
function Person() {
  this.name = ‘zhar‘;
  return 1;//number string boolean 等
}
var p = new Person();
console.log(p.name);//zhar

所以,如无必要我们通常不要设置构造函数的返回值

4、事件对象

在 DOM 事件中使用 this,this 指向了触发事件的 DOM 元素本身

li.onclick = function(){
    console.log(this.innerHTML);
}

总结下来就是一句话:是谁调用的,this就指向谁

下面介绍一下如何来修改this 的指向

1、可以使用局部变量来代替this指针

var name = "zhar";
var obj = {
  name : "zhar",
  say : function(){
    var _this = this;//使用一个变量指向 this
    setTimeout(function(){
      console.log(_this.name);
    },0);
  }
}
obj.say();

该方法为非常常用的一个方法

2、使用call 或 apply 方法

首先说明一下,call也是函数调用的一种形式,可以通过 函数名.call()来调用函数。但是提供了一个修改this指向的方法。

fun.call(thisObj[,arg1[,arg2[,...]]])

调用方式和传入参数如上面的形式。其中,所以call(thisObj[,arg1[,arg2[,...]]])中的第一个参数就是要更改this指向的对象,为必选参数; 之后的参数要根据调用的函数是否需要传入参数(为可选的)

下面通过代码来展示call 如何使用:

var name = ‘zhar‘;
function say(){
  console.log(this.name);
};
say();//zhar;
var obj = {
  name : ‘tom‘,
  say : function(){
    console.log(this.name);
  }
}
say.call(obj);//tom      将 say 函数中的 this 替换为传入的对象
obj.say();//tom
obj.say.call(null);//zhar    将 obj.say 函数的 this 替换为了 null,也就意味着指向了全局环境
//前面课程的继承代码
function Person(){
  this.name = "人";
}
function Student(){
  Person.call(this,null);
}
var s = new Student();
console.log(s.name);
li.onclick = function(){
  console.log(this.innerHTML);//此处的 this 代表着 DOM 元素
  function update(){
    this.innerHTML += " new ";
  }
  //update();//这样做的话,this 的指向将变为window
  update.call(this);//通过 call 方法修改函数内 this 的指向
}
//call 的传参
function say(arg1,arg2){
  console.log(this.name,arg1,arg2);
};
var obj = {
  name : ‘tom‘,
  say : function(){
    console.log(this.name);
  }
}
say.call(obj,‘one‘,‘two‘);//tom one two

apply

apply的作用和call一样,不同的是传参的形式。apply需要以数组的形式传递参数

//apply 的传参
function say(arg1,arg2){
  console.log(this.name,arg1,arg2);
};
var obj = {
  name : ‘tom‘,
  say : function(){
    console.log(this.name);
  }
}
say.apply(obj,[‘one‘,‘two‘]);//tom one two

以上就是关于this指向和如何修改this指向的介绍

点击查看原文

原文地址:https://www.cnblogs.com/taohuaya/p/10454985.html

时间: 2024-08-28 11:41:28

JS中----this的指向和如何修改this的指向的相关文章

关于js中this指向的理解总结!

关于js中this指向的理解! this是什么?定义:this是包含它的函数作为方法被调用时所属的对象. 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解有些准确的),那么接下来我会深入的探讨这个问题. 例子1: function a(){ var user = " 小明"; console.log(this.user);

js 中this到底指向哪里?

其实js的this指向很简单.我们记住下面3种情况. this 指向的是浏览器中的window.代码如下: function fn(){ this.name='yangkun'; this.age=28; } 当我们执行fn()的时候,这个普通函数中的this指向到底是什么?答案就是指向的是浏览器中的window.(这里说明,这里实在浏览器下,如果是node环境不是). 如果这个时候我们对上面的函数进行进一步操作: function fn(){ this.name='yangkun'; this

js中this绑定方式及如何改变this指向

this的绑定方式基本有以下几种: 隐式绑定 显式绑定 new 绑定 window 绑定 箭头函数绑定 隐式绑定 第一个也是最常见的规则称为 隐式绑定. var a = { str: 'hello', sayHi() { console.log(this.str) } } a.sayHi() a 调用sayHi,所以this指向了对象a 我们来看一个类似但稍微高级点的例子. var wrapper = { name: 'user1', sayName() { console.log(this.n

了解Js中的this指向

Js中的this对象是在运行时基于函数的执行环境绑定的,其中的this指向很不好理解,一不小心就用错了位置;. this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象. 对于this指向的理解,我分以下几种情况来说, this的指向: 1.在全局函数中,this等于window: var name="cyp"; console.log(this); 2.当函数被用作为某个对象的方法调用时,this等于哪个对

转:彻底理解js中this的指向,不必硬背

转:http://www.cnblogs.com/pssp/p/5216085.html 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题. 为什么要学习this?

JS中函数的 this 各种指向

this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 情形1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window. 情形2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象. 情形3:如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,

js中this指向问题

js中this指向问题老生常谈的问题了,在这里说一下我所理解的层面的this. this 指的是当前对象,如果在全局范围内使用this,则指代当前页面window:如果在函数中使用this,则this指代什么是根据当前函数是在什么对象上调用.我们可以使用call和apply改变函数中this的具体指向. console.log(this === window) // true console.log(window.alert === this.alert) // true console.log

彻底理解js中this的指向,不必硬背。

原文链接:http://www.cnblogs.com/pssp/p/5216085.html 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题. 为什么要学习th

JS 中 this 的指向

文章转载自: 作者:伯乐在线专栏作者 - 追梦子 链接:http://web.jobbole.com/88264/ 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题