this、apply、call的指向
1、关于this
this它总是返回一个对象,是指调用当前函数的对象,由于对象的属性可以赋给另一个对象,所以属性所在的当前对象是可变的,即this的指向是可变的。
 var person={
        name:"张三",
        getName:function () {
            return "姓名"+this.name
        }
    }
    var person2={
        name:"李四"
    };
    person2.getName=person.getName;
    console.log(person.getName())        //姓名张三
    console.log(person2.getName())    //姓名李四
在上面代码中person中的getName属性被赋给person2对象,此时person2.getName()指向的就是person2对象,所以this.name指向的就是person2的name属性。
this的实质
JavaScript 语言之所以有 this 的设计,跟内存里面的数据结构有关系。
var person2={
        name:"李四"
    };
上面代码将一个对象赋值给一个变量,首先JavaScript 引擎会先在内存里面,生成一个对象{ name: "李四" },然后把这个对象的内存地址赋值给变量person2,也就是说,变量person2是一个地址(reference)。后面如果要读取person2.name,引擎先从person2拿到内存地址,然后再从该地址读出原始的对象,返回它的name属性。
原始的对象以字典结构保存,每一个属性名都对应一个属性描述对象。举例来说,上面例子的foo属性,实际上是以下面的形式保存的。
{
        foo: {
            [[value]]: '李四'
            [[writable]]: true
            [[enumerable]]: true
            [[configurable]]: true
        }
    }
name的值保存在属性描述对象的value属性里面。
如果属性值是一个函数会是什么样子
var obj={
        f:function () {
        }
    }
引擎会将函数单独保存在内存中,然后再将函数的地址赋值给f属性的value属性。
{
  f: {
    [[value]]: 函数的地址
    ...
  }
}
重点就是这个,因为函数是单独保存的,所以不同的执行环境会有不同的上下文。由于函数可以在不同的运行环境执行,所以需要有一种机制,能够在函数体内部获得当前的运行环境(context)。所以,this就出现了,它的设计目的就是在函数体内部,指代函数当前的运行环境。
this使用场景
- 全局环境,全局环境游览器环境下使用this,它指的就是顶层对象window,node环境下就是global了。
function test() {
        console.log(this==window)        //true
    }
    test()
2、构造函数
构造函数内this指向的是生成的实例对象
function test(name) {
        this.name=name;
    }
    var test2=new test("张三");
    console.log(test2.name)    //张三
  通过new命令生成的test2实例对象,由于this指向实例对象,所以在构造函数内部定义this.name,就相当于定义实例对象有一个name属性。
3、对象的方法
·  如果对象里面方法包括this,this指向的就是该方法运行时所处的对象,该方法赋值给另一个对象,就会改变this的指向。具体代码见第一个实例代码。
绑定this
this的动态切换,固然为 JavaScript 创造了巨大的灵活性,但也使得编程变得困难和模糊。有时,需要把this固定下来,避免出现意想不到的情况。JavaScript 提供了call、apply、bind这三个方法,来切换/固定this的指向。
Function.prototype.call()
函数实例的call方法,可以指定函数内部this的指向(即函数执行时所在的作用域),然后在所指定的作用域中,调用该函数。
var test="tony";
function doSomething(){
alert(this.test);//tony
alert(window.test);//tony
}
doSomething();
doSomething在全局调用,相当于window.doSomething();所以里面的this指向window对象,this.test=window.test="tony";
this、apply、call的指向的更多相关文章
- this的指向问题、bind/call/apply改变this指向
		this的指向问题 全局作用域下的this指向 无论是否是严格模式,全局作用域下的this始终指向window 函数内部的this 严格模式下: function test() { 'use stri ... 
- call()与apply() 改变this指向
		p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #a5b2b9 } span.Apple-tab-span ... 
- call/apply以及this指向的理解
		javascript是面向对象的语言,Function也是一种对象,有自己的属性和方法.call和apply就是js函数自带方法,挂在Fucntion.prototype上. 一般调用某函数时,直接“ ... 
- call , apply的this指向实现原理并自己实现封装
		实现this指向原理 var value = 'value' var obj = { value: 'obj' } function func() { console.log(this.value) ... 
- JS中this的指向问题&使用call或apply模拟new
		this的指向由调用时决定而不是定义时决定,定义的方式: //直接定义在函数里 var a="window中的a"; var name="window"; fu ... 
- js中更改this指向  以及回顾bind、call和apply
		1.更改this指向 方法1:对this进行保存 var _this = this; 例: var _this = this; document.onclick = fu ... 
- js中的this和apply
		this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 1.纯粹函数调用. function test() { this. ... 
- Js中call apply函数以及this用法
		this介绍: C#里this关键字的意义比较确定的.JavaScript的this关键字,随着函数使用场合不同,this的值会发生变化,感觉用法比较混乱,所以,现在是有必要整理一下的时刻了! 总结一 ... 
- 关于 this对象 指向问题
		this 定义:this是包含它的函数作为方法被调用时所属的对象.(1,this所在的函数.2,此函数作为方法被调用.3,this等于调用此函数的对象) this 对象在运行时基于函数的执行环境绑定的 ... 
- 数组去重,call、apply、bind之间的区别,this用法总结
		一.数组去重,直接写到Array原型链上. //该方法只能去除相同的数字 不会去判断24和'24'是不同的 所有数字和字符串数字是相同是重复的 Array.prototype.redup=functi ... 
随机推荐
- codeforces 658D D. Bear and Polynomials(数学)
			题目链接: D. Bear and Polynomials time limit per test 2 seconds memory limit per test 256 megabytes inpu ... 
- 机器学习: R-CNN, Fast R-CNN and Faster R-CNN
			做语义分割的大概都知道这几篇文章了,将一个传统的计算机视觉模型,用CNN一点一点的替换,直到最后构建了一个完整的基于CNN的端到端的模型.这几篇文章有一定的连贯性.从中可以看到一种研究的趋势走向. 上 ... 
- 【LeetCode】047. Permutations II
			题目: Given a collection of numbers that might contain duplicates, return all possible unique permutat ... 
- vue之axios请求数据本地json
			写给自己的话:静态的json文件要记得放在static文件夹下,想打自己 1.下载插件 npm install axios --save 2.在main.js下引用axios import axios ... 
- drop asm disk、撤销drop asm disk
			drop asm disk.撤销drop asm disk drop asm disk:SQL> alter diskgroup XXX offline disk XXXX drop after ... 
- 洛谷 P5061 秘密任务 —— 二分图
			题目:https://www.luogu.org/problemnew/show/P5061 首先,“配合默契”就是连边的意思: 但发现答案不好统计,因为有连边的两个点可以分在一组,也可以不分在一组: ... 
- ZigBee简介
			前言 目前,中国大力推广的物联网是zigbee 应用的主战场,物联网通过智能感知.识别技术与普适计算(我还特意申请了个域名psjs.vip).泛在网络的融合应用,被称为继计算机.互联网之后世界信息产业 ... 
- 2013-2014回首&展望
			2013年,可以说是此前18年中,最重要最感触的一年了. 和老婆相爱,考高考,入大学等等事情全都在这美妙的一年里发生了. 2013: 开心:·和老婆相爱,共同经历了大大小小的风雨·每天都有期待的东西· ... 
- linux 下消息队列发送后没有信息
			在使用消息队列时,调用 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ... 
- 干货:SEO长尾关键词优化方法和技巧
			在网站SEO优化上,优化比较成功的网站,根据SEO界前辈的经验结论,网站的总流量主要来源于长尾关键词,占网站总流量的80%.长尾关键词主要分布在网站的文章页,其次就是栏目页title.标签页.专题页等 ... 
