this

  • 在面试中,js指向也常常被问到,在开发过程中也是一个需要注意的问题,严格模式下的this指向undefined,这里就不讨论。

普通函数

  • 记住一句话哪个对象调用函数,该函数的this就指向该对象。总指向它的调用者。

obj.getName() 无疑会打印出'黄杰',b()可以写成window.b(),调用的对象为window,因此访问的name为全局的变量。

var name = '车神'
var obj = {
name: '黄杰',
getName: function(){
console.log(this.name)
}
} var b = obj.getName obj.getName()// '黄杰'
b() // '车神'
  • 但是下面的代码,可能就会有点疑惑了,为什么打印的是undefined,因为全局使用var声明的变量会成为window的属性,而ES6的let、const声明的变量不再是window的属性,通过window.name不能访问该属性。
let name = '车神'
let obj = {
name: '黄杰',
getName: function(){
console.log(this.name)
}
} let b = obj.getName b() // undefined

箭头函数

  • 箭头函数在定义时就决定了this的指向,定义时所处的上下文环境对象即为this的指向,全局的上下文环境对象为window。

有些人认为不应该是两个都是'黄杰吗'?js中的执行上下文有全局、函数、Eval执行上下文,对象并不是执行上下文,因此它会一直往上寻找最近的执行上下文。即为window。

var name = '车神'
var obj = {
name: '黄杰',
getName: () =>{
console.log(this.name)
}
} var b = obj.getName obj.getName()// '车神'
b() // '车神'

new操作符

1、创建一个空的简单JavaScript对象(即{});

2、链接该对象(即设置该对象的构造函数)到另一个对象 ;

3、将步骤1新创建的对象作为this的上下文 ;

4、如果该函数没有返回对象,则返回this。

面试题一

  • 这是我目前看到最有意思的面试题,先思考两分钟...

var length = 100 function foo(){
console.log(this.length)
} var obj = {
length: 10,
getLength(cb){
cb()// 打印啥?
arguments[0]()// 打印啥?
}
} obj.getLength(foo, length, obj)

1.答案是100、3。

2.cb()调用的对象为window,arguments[0] ()的调用对象为arguments,它是一个伪数组,也是一个对象,length为函数调用时传递参数的长度,因此打印3。

面试题二

  • 这道题也有点意思,还做错了,先思考两分钟
function foo(xx){
this.x = xx
return this
} var x = foo(5) var y = foo(6) console.log(x.x)// 打印啥?
console.log(y.x)// 打印啥?

1.答案是undefined、6,两次调用this都指向window。

2.当执行foo(5)时,得到window.x = window,window.x.x = 5。

3.当执行foo(6)时,this.x = 6相当于window.x = 6,不再是window.x = window,此时window.x并没有x属性,因此通过x.x访问不存在的属性为undefined。

js中函数this的指向的更多相关文章

  1. JS中函数参数和函数返回值的理解

    函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...

  2. 关于js中函数的调用问题

    js中函数的调用方法 1.直接调用 函数名(参数): 2.通过指向函数的变量去调用 例如: var myval = 函数名: 此刻 myval是指向函数的一个指针: myval(实际参数):此刻调用的 ...

  3. 对JS中函数的理解

    函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...

  4. js中函数传参的情况

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. JS中函数void()

    <a href="javascript:void(0)">hello</a>/* * JS中函数void()的运用大体是这种新式; * void()是运算符 ...

  6. js中函数的参数为函数的情况即回调函数

    js中函数的参数可以是数组对象也可以是函数,当参数为函数时我们叫做回调函数 //定义回调函数function B() { console.log("函数B")setTimeout( ...

  7. JS中函数的 this 各种指向

    this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 情形1:如果一个函数中有this,但是它没有被上一级的对象所调用, ...

  8. js中函数的一些理论知识

      函数的一些理论知识 1. 函数:                执行一个明确的动作并提供一个返回值的独立代码块.同时函数也是javascript中的一级公民(就是函数和其它变量一样). 2.函数的 ...

  9. 从Ecma规范深入理解js中的this的指向

    this是面向对象编程中的一个概念,它一般指向当前方法调用所在的对象,这一点在java.c++这类比较严格的面向对象编程语言里是非常明确的.但是在javascript中,this的定义要灵活许多,如果 ...

随机推荐

  1. NOIP2009 压轴---最优贸易

    链接:https://ac.nowcoder.com/acm/contest/959/H来源:牛客网 C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市.任意两个城市之间最多只有一条道路 ...

  2. 曹工杂谈--使用mybatis的同学,进来看看怎么在日志打印完整sql吧,在数据库可执行那种

    前言 今天新年第一天,给大家拜个年,祝大家新的一年里,技术突突突,头发长长长! 咱们搞技术的,比较直接,那就开始吧.我给大家看看我demo工程的效果(代码下边会给大家的): 技术栈是mybatis/m ...

  3. cmake安装mysql及多实例配置方法

    一.安装mysql 1. 生产环境如何选择MySQL版本 1. 选择社区版的稳定GA版本2. 可以选择5.1或5.5.互联网公司主流5.5, 其次是5.1和5.63. 选择发布后6个月以上的GA版4. ...

  4. 超详细Node安装教程

    今天周末休息,我制定了我的2020年度规划,其中包含编写50篇养成写博文的习惯.算下来平均每周一篇,感觉也不是很难,但我的写作能力不是很好,争取一次比一次好!希望自己能够坚持下去.2020为自己而活, ...

  5. 2019年终总结&小半年流媒体服务器开发经验总结

    目录 2019年终总结&小半年流媒体服务器开发经验总结 19年开发小结 流媒体服务框架设计 登录服开发 ffmpeg音视频服务开发 音视频控制 流媒体服务开发小结 rtp处理 视频的合成&am ...

  6. 从操作系统层面理解Linux下的网络IO模型

    I/O( INPUT OUTPUT),包括文件I/O.网络I/O. 计算机世界里的速度鄙视: 内存读数据:纳秒级别. 千兆网卡读数据:微妙级别.1微秒=1000纳秒,网卡比内存慢了千倍. 磁盘读数据: ...

  7. 斯坦福算法分析和设计_2. 排序算法MergeSort

      Motivate MergeSort是个相对古老的算法了,为什么现在我们还要讨论这么古老的东西呢?有几个原因: 它虽然年龄很大了,但是在实践中一直被沿用,仍然是很多程序库中的标准算法之一. 实现它 ...

  8. 交换一个数字的任意两个位置,指定K次的最值

    Anton has a positive integer n, however, it quite looks like a mess, so he wants to make it beautifu ...

  9. 树上对抗搜索 - 树形dp

    Alice and Bob are going on a trip. Alice is a lazy girl who wants to minimize the total travelling d ...

  10. Gitlab应用——系统管理

    ​ 查看linux系统信息 ​ 查看日志 ​ ​ 创建账号 ​ 选择regular,这是一个普通账号,点击“create user”账号创建完成 ​ 点击“User”,然后点击“New user”.使 ...