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指向的更多相关文章

  1. 详解js中的闭包

    前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以<javascript高级程序设计>里面的理论为基础.用拆分的方式 ...

  2. 详解js中的寄生组合式继承

    寄生组合式继承是js中最理想的继承方式, 最大限度的节省了内存空间. js中的寄生组合式继承要求是: 1.子对象有父对象属性的副本, 且这些不应该保存在子对象的prototype上.       2. ...

  3. 详解JS中DOM 元素的 attribute 和 property 属性

    一.'表亲戚':attribute和property 为什么称attribute和property为'表亲戚'呢?因为他们既有共同处,也有不同点. attribute 是 dom 元素在文档中作为 h ...

  4. 详解 JS 中 new 调用函数原理

    JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数),那在使用 new 调用一个函数的时候到底发生了什么?先看几个例子,再解释背后发生了什么. 1)看三个例子 1.1 ...

  5. 详解Js中文件读取机制

    前言,文件读取是提高应用体验度的必须接口,应用场景中需求很频繁. Js处理文件读取,由于处于安全方面的考虑,在2000年以前,都是以“<input type="file"&g ...

  6. 详解js中的apply与call的用法

    前言 call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.call 和 apply二者的作用完全一样,只是接受 ...

  7. 详解JS中 call 方法的实现

    摘要:本文将全面的,详细解析call方法的实现原理 本文分享自华为云社区<关于 JavaScript 中 call 方法的实现,附带详细解析!>,作者:CoderBin. 本文将全面的,详 ...

  8. 详解JS中Number()、parseInt()和parseFloat()的区别

    三者的作用: Number(): 可以用于任何数据类型转换成数值: parseInt().parseFloat(): 专门用于把字符串转换成数值: 一.Number( ): (1)如果是Boolean ...

  9. 详解js变量、作用域及内存

    详解js变量.作用域及内存 来源:伯乐在线 作者:trigkit4       原文出处: trigkit4    基本类型值有:undefined,NUll,Boolean,Number和Strin ...

随机推荐

  1. CentOS7 开放端口 通过 firewall-cmd 工具来操作防火墙

    CentOS7 提供了 firewall-cmd 工具来操作防火墙. firewall-cmd --permanent:表示设置为持久,配置被写入配置文件,跨重启,不会立即生效,重新加载配置后生效.不 ...

  2. python--协程知识初识

    线程和进程的操作是由程序触发系统接口,最后的执行者是系统:协程的操作则是程序员. 协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续).协程 ...

  3. Scrapy笔记05- Item详解

    Scrapy笔记05- Item详解 Item是保存结构数据的地方,Scrapy可以将解析结果以字典形式返回,但是Python中字典缺少结构,在大型爬虫系统中很不方便. Item提供了类字典的API, ...

  4. 【jupyter】文件解压

    Jupyter使用便捷,但是不能上传文件夹.可以将文件夹压缩,上传后再利用python或者terminal进行解压. windows 可以用python的zipfile包来解压.比如: import ...

  5. Java 并发系列之三:java 内存模型(JMM)

    1. 并发编程的挑战 2. 并发编程需要解决的两大问题 3. 线程通信机制 4. 内存模型 5. volatile 6. synchronized 7. CAS 8. 锁的内存语义 9. DCL 双重 ...

  6. 关于Vue中props的详解

    看一下官方文档: 组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据.父组件的数据需要通过 prop 才能下发到子组件中. 也就是props是子组件访问父组件数 ...

  7. jquery根据选择器进行页面赋值,封装赋值方法

    可以进行文本框赋值,文本域赋值,下拉列表赋值,单选框赋值,多选框赋值, 传入对象,可以根据元素name进行比对赋值,不用每个进行单独赋值 <!DOCTYPE html> <html ...

  8. MySQL基础概念知多少

    MySQL基础概念相关的名词还是挺多的,比如3大范式.4种隔离界别.ACID.DQL.DML.DDL,还有redo.undo.binlog等,本文就统一整理下MySQL常见的基础概念,方便小伙伴们翻阅 ...

  9. 用rust实现高性能的数据压缩工具

    https://github.com/richox/orz [求watch/star/fork] rust是一门新兴的程序语言,有着不输C/C++的性能.简洁精练的语法和可靠的内存安全性.orz是一款 ...

  10. 【K8S】helm chart多环境部署最佳实践-示例

    Chart.yaml apiVersion: v1 appVersion: "1.0" description: A Helm chart for Kubernetes name: ...