this 定义:this是包含它的函数作为方法被调用时所属的对象。(1,this所在的函数。2,此函数作为方法被调用。3,this等于调用此函数的对象)

this 对象在运行时基于函数的执行环境绑定的。在全局环境中this等于window,当函数作为某个对象的方法调用时,this等于那个对象。所以说,this的指向完全

取决于函数的调用方式。

1》函数的四种调用方式

1.函数调用模式

function fn() {console.log(this)}
fn(); //window

this是全局对象(window)

2.方法模式

var obj = {
   a: function() {console.log(this)}
};

obj.a(); //this指向obj

this是当前调用方法的对象

3. 构造器模式(constructor)

function Fn() {this}//this指向p
   var p = new Fn();

function Point(x, y){
this.x = x;
this.y = y;
}

this指向新创建出来的对象

4上下文模式 (通过call或apply改变函数执行环境的情况下 ,this 也会指向其他对象)

1.函数名.apply(this指向的对象,[参数1, 参数2, ...])

function foo() {console.log( this );}
        foo.apply();//this指向window
        foo.apply( null );//this指向window
         var o = { name: 'aaa' };
       foo.apply( o );//this指向o,用o调用foo

2. 函数名.call(this指向的对象,参1,参2...);

call和apply的区别  apply的第二个参数是数组形式,call第二个参数是单个参数分开传入

例子:

 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]);
我们看到使用 apply 可以将 p1 的方法应用到 p2 上,这时候 this 也被绑定到对象 p2 上

2》在闭包中如果把外部作用域中的this对象保存在一个闭包能够访问到的变量里面。就可以让闭包访问该对象。

var name='jim';var obj={
    name:'tom',
    getName:function(){
        var that=this;
        return function(){
            return that. name;
        }
    }
}
alert(obj.getName()())//'tom'
 that是在包含函数中特意声明的变量  它指向的obj

3》语法的细微变化 也会引起this的变化

var name='jim';
var obj={
    name:'tom',
    getName:function(){
            return this. name;
    }
}
obj.getName() // tom
(obj.getName=obj.getName)()//jim
     第二个打印进行了一次赋值操作   所谓赋值
    如果a=b=function(){} 先将函数赋值给b 再将函数赋值给a

在例子中 (a=b)它是赋值后的结果 也就是函数本身 调用函数本身 则此时this指向window.

关于 this对象 指向问题的更多相关文章

  1. this对象指向

    this表示函数运行时,自动生成的一个内部对象,只能在函数内部运行 function test(){ this.x = 1; } 随着使用场景的变化,this的值会发生变化 原则:this指的值调用函 ...

  2. 关于java基础中,接口里面父类的对象指向子类的引用

    父类的引用指向子类的对象,它只能看的到父类的那些方法~ 子类自身的方法看不到-- ······························· 如: interface Singer { //定义了 ...

  3. JavaScript setTimeout this对象指向问题

    上面这幅图片是原始的效果, 现在想鼠标移到图标上,显示图标的提示,但需要延时,也就是鼠标滑至图标上,并不立刻显示,而是等1秒后显示. html部分 <div class="porHea ...

  4. JavaScript中的this对象指向理解

    在JavaScript中,this不是固定不变的,它的指向取决于上下文环境,一般的,认为this指向使用它时所在的对象.主要有以下几类指向: 在方法中,this 表示该方法所属的对象. 如果单独使用, ...

  5. 声明对象的方式/构造函数/原型/this指向

      函数的发展历程(声明函数的方式):     1.通过Object构造函数或字面量的方式创建单个对象 var obj = new Object; obj.name="新华"; o ...

  6. 理解jQuery对象$.html

    前面的话 如果要比喻jQuery和原生javascript的关系,我个人认为是自动档和手动档汽车的区别.使用原生javascript,可以知道离合器以及档位的作用:而使用jQuery,则把离合器和手动 ...

  7. java面向对象---对象容器

    泛型类--ArrayList<>; 2.对象数组中的每个元素都是对象的管理者而并非对象本身!!!!! 3.java类的基本数据类型 基本数据类型 包装类 byte Byte short S ...

  8. iOS判断对象相等 重写isEqual、isEqualToClass、hash

    相等的概念是探究哲学和数学的核心,并且对道德.公正和公共政策的问题有着深远的影响. 从一个经验主义者的角度来看,两个物体不能依据一些观测标准中分辨出来,它们就是相等的.在人文方面,平等主义者认为相等意 ...

  9. JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

随机推荐

  1. webservice基本功能介绍

    WebService, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据WebService规范实施的应用之间, 无论它们所使用的语言. 平台或内 ...

  2. 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题

    一.问题分析 对于后台系统,相比大家都有所印象,知道其中的布局结构,如图: 在这种布局中我们需要将header,sidebar,footer分开,而且对于中间部分的content内容需要动态变化,即根 ...

  3. 每天一个linux命令(49)--diff命令

    diff 命令是 Linux 上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff 在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件,diff ...

  4. 读书笔记 effective c++ Item 26 尽量推迟变量的定义

    1. 定义变量会引发构造和析构开销 每当你定义一种类型的变量时:当控制流到达变量的定义点时,你引入了调用构造函数的开销,当离开变量的作用域之后,你引入了调用析构函数的开销.对未使用到的变量同样会产生开 ...

  5. Laravel使用Seeder自动填充数据

    要查看代码,可以点击 或者转到链接:https://github.com/laravel/framework Laravel自动填充数据使用的是Seeder类 <?php use Illumin ...

  6. App Store 审核 IPv6 问题

    应用提交了N次,每次被拒都是说IPv6的事情,花点功夫把这个事情搞清楚. 苹果审核人员回复的原因都差不多,说在他们的IPv6-Only的环境中测试应用,无法正常请求我们的服务器. 因为我们的域名确实没 ...

  7. Java面试系列

    如果你的面试简历是如下这样写的,请务必准备回答下面的所有问题. 面试职位:Java高级工程师 专业技能: (1)牢固掌握Java基础知识,如集合.并发.I/O等,并对Java源码有一定的研究. (2) ...

  8. 腾讯云数据库团队:浅谈如何对MySQL内核进行深度优化

    作者介绍:简怀兵,腾讯云数据库团队高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MySQL内核开发工作 ...

  9. Archlinux 的U盘自动装载(一)udisks

    为什么要用 udisks + udevil 方式自动装载 U 盘? Gnome 和 KDE 下的很多文件管理器都有自己的U盘装载方案.但我的应用环境为: Archlinux,xorg,Openbox, ...

  10. 原生js更改css样式的两种方式

    下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3  &quo ...