详解js中的this指向
this指向问题是个老生常谈的问题了,现在我给大家一个例子
var obj={
bar:'Cynthia' ,
foo:function(){
console.log(this.bar,"wahahah")
}
}
var foo=obj.foo;
foo(); // 0 "wahahah"
obj.foo(); // Cynthia wahahah
虽然obj.foo和foo指向同一个函数,但是执行结果却不一样。
造成这种差异的原因,就在于函数体内部使用了this关键字。很多教材里面会告诉你,this指向的是其运行时所在的环境。但是光看这句话是不是有点懵
下面我把this的指向都列给大家
浏览器
非严格模式下
function add(x,y){
console.log(this); // window
return x+y;
}
add(1,40);
在非严格模式下的时候,this的运行环境所在的环境是windows,所以返回的是window
严格模式下
function add(x,y){
'use strict'
console.log(this); // undefined
return x+y;
}
add(1,40);
JavaScript高级程序设计中有这样一句话:在严格模式下,未指定环境对象而调用函数,则this值不会转为window。除非明确把函数添加到某个对象或者调用appy()或call(),否则this值将是undefined
看是否绑定了new
如果绑定了new的话,并且构造函数没有返回function或object,那么this指向这个新对象
function Person(name,age){
this.name=name;
this.age=age;
this.sayHi=function(){
console.log(this.age)
}
}
let person=new Person("那抓",6);
person.sayHi();// 6
构造函数返回值是function或者object,返回的是构造函数返回的对象
function Super(age){
this.age=age;
let obj={a:'2'};
return obj;
}
let instance=new Super(30);
console.log(instance);// {a:2}
console.log(instance.age);// undefined
箭头函数
箭头函数没有自己的this,继承外层上下文绑定的this
let obj={
age:20,
info:function(){
return ()=>{
console.log(this,this.age); // this继承的是外层上下文绑定的this
}
}
}
let person={age:30};
let info=obj.info();
info(); // 指向的是obj
let info2=obj.info.call(person);
info2();
node环境中
node环境中无论是否在严格模式下,在全局执行环境中(在任何函数体外部)this都指向空对象{}
详解js中的this指向的更多相关文章
- 详解js中的闭包
前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以<javascript高级程序设计>里面的理论为基础.用拆分的方式 ...
- 详解js中的寄生组合式继承
寄生组合式继承是js中最理想的继承方式, 最大限度的节省了内存空间. js中的寄生组合式继承要求是: 1.子对象有父对象属性的副本, 且这些不应该保存在子对象的prototype上. 2. ...
- 详解JS中DOM 元素的 attribute 和 property 属性
一.'表亲戚':attribute和property 为什么称attribute和property为'表亲戚'呢?因为他们既有共同处,也有不同点. attribute 是 dom 元素在文档中作为 h ...
- 详解 JS 中 new 调用函数原理
JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数),那在使用 new 调用一个函数的时候到底发生了什么?先看几个例子,再解释背后发生了什么. 1)看三个例子 1.1 ...
- 详解Js中文件读取机制
前言,文件读取是提高应用体验度的必须接口,应用场景中需求很频繁. Js处理文件读取,由于处于安全方面的考虑,在2000年以前,都是以“<input type="file"&g ...
- 详解js中的apply与call的用法
前言 call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.call 和 apply二者的作用完全一样,只是接受 ...
- 详解JS中 call 方法的实现
摘要:本文将全面的,详细解析call方法的实现原理 本文分享自华为云社区<关于 JavaScript 中 call 方法的实现,附带详细解析!>,作者:CoderBin. 本文将全面的,详 ...
- 详解JS中Number()、parseInt()和parseFloat()的区别
三者的作用: Number(): 可以用于任何数据类型转换成数值: parseInt().parseFloat(): 专门用于把字符串转换成数值: 一.Number( ): (1)如果是Boolean ...
- 详解js变量、作用域及内存
详解js变量.作用域及内存 来源:伯乐在线 作者:trigkit4 原文出处: trigkit4 基本类型值有:undefined,NUll,Boolean,Number和Strin ...
随机推荐
- 【AICC】2019训练营笔记
1.AI 人工的方法在机器上实现智能:机器学习.计算机视觉.规划决策.自然语言处理.认知推理.高效搜索 2.三大学派 符号主义 连接主义:CNN 行为主义 3.两条路线 结构模仿 功能模仿 4.AI芯 ...
- 25-C#笔记-文件的输入输出
1. 写txt FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileSh ...
- 使用 Docker-Compose 编排容器
我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排.服务编排有很多种技术方案,今天给大家介绍 Docker 官方产品 Docker Comp ...
- 阿里巴巴java开发手册 注释规约
- c# 关于反射
反射的用途大体总结:1.使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从程序集中查找类型并创建该类型的实例.CreateInstance2.使用Module了解包含模块的程序集 ...
- java 多态(向上转型)
多态的定义与使用格式 多态的定义格式:就是父类的引用变量指向子类对象 父类类型 变量名 = new 子类类型(); 变量名.方法名(); 普通类多态定义的格式 父类 变量名 = new 子类(); ...
- django -- 安装django
安装 通过cmd进行安装 pip3 install django==1.11.11 创建django项目 通过命令行进行创建 下面的命令创建了一个名为"mydjango"的Djan ...
- python requests 上传excel数据流
headers=self.headers #获取导入模版 file_home = self.import_template log.info(file_home) wb = load_workbook ...
- ipv6转ipv4 NAT64与DNS64基本原理概述
原文: https://blog.csdn.net/zhangjie1989/article/details/51464251 1.NAT64与 DNS64背景 在 IPv6网络的发展过程中,面临最大 ...
- css特效之旋转音乐播放器
本次需要用到的知识点有: transform setInerval 怎么添加背景音乐我会在下一篇介绍 https://www.cnblogs.com/zouwangblog/p/11138734.ht ...