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。

最新文章

  1. 蓝牙防丢器原理、实现与Android BLE接口编程
  2. [M]表格中的天正文字转换问题
  3. queue STL
  4. Google 怎么搜索
  5. Kafka0.10.2.0分布式集群安装
  6. Centos 7.3 编译 & 安装 & 测试 facebook faiss
  7. Java实现单链表的快速排序和归并排序
  8. GIT 查看 删除 添加远程库
  9. Spring Cloud @HystrixCommand和@CacheResult注解使用,参数配置
  10. 【机器学习】--LDA初始和应用
  11. Django2.1.2创建默认管理后台
  12. Python3.7和数据库MySQL 8.0.12 绿色解压 安装教程(一)
  13. Android Jsoup 爬取网页数据
  14. tiny4412-Uboot启动分析
  15. DOM-XML(解析与创建)
  16. .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  17. SQL OUTER JOIN
  18. UEditor API 文档
  19. 简单的HTTP服务实现
  20. translation exercise 3

热门文章

  1. 洛谷$P2805\ [NOI2009]$植物大战僵尸 网络流
  2. NB的程序员,亮瞎了你的眼吗?
  3. 学海无涯-php
  4. 微服务统计,分析,图表,监控一体化的HttpReports项目在.Net Core 中的使用
  5. ocx控件的坑
  6. input值
  7. 快到极致的Android模拟器——Genymotion
  8. Sql Server执行一条Update语句很慢,插入数据失败
  9. AspectJ——预编译方式实现AOP
  10. Linux普通用户如何获取root权限 sudo -i