var length = 10
function fn(){
alert(this.length)
} var obj = {
length: 5,
method: function(fn) {
fn() // ?
arguments[0]() // ?
}
}
obj.method(fn)

这是今天在群里看到的一个题目,很多人来作答,但是大家一开始都答错了,什么答案都有。

我先来公布一下正确答案:10,1

然后我来解释一下为什么:

首先定义了一个var length=10;这没什么好说的

然后声明一个函数function fn(){ alert(this) alert(this.length) }

在这一步你执行fn()会弹出10,因为length是定义在window下,fn也是在window下调用,this指向window;

然后是定义一个对象:var obj = { length: 5, method: function(fn) { fn() // ? arguments[0]() // ? } }

对象里也有一个length属性和一个method的方法:

最后调用了对象下的method的方法;

首先会跑function(fn) { fn() // ?  }我们看到fn被作为参数传递进来,然后执行fn(),那么在执行fn()的时候,就是执行的外面的fn而外面的fn是在window下的,this是指向window,他自然也只能找到window下的length属性;找不到obj下的length

然后跑function(fn) {arguments[0]() // ? }我们看到fn被作为参数传递进来,然后执行这个参数,这是的this指向的是这个参数,那么参数的length为1,结果就是1

如果你加一个参数obj.method(fn,“heihei”)这样第二次的结果就是2了,

如果你还不是很理解那么在fn函数里alert(this)一下,或许就能明白了

以上为个人理解,如有纰漏或错误忘留言指正。

最新文章

  1. ASP.NET MVC Autofac自动注入
  2. 3、Android Intent Flag的介绍
  3. 深入理解Java虚拟机之读书笔记二 垃圾收集器
  4. Visual Studio中编写C程序
  5. Linux下面使用rpm命令
  6. 杭电hdoj题目分类
  7. jmeter生成报告指示板
  8. js中关于事件处理函数名后面是否带括号的问题
  9. .NET下解析Json的方法
  10. 第十二篇、高度自适应的textView
  11. 仿猪八戒一个提示(jQuery插件) v0.1 beta
  12. POJ1679(次小生成树)
  13. Thrift实现C#通讯服务程序
  14. Linux:用at和crontab调度作业
  15. LeetCode题解之Sum Root to Leaf Numbers
  16. windows安装gitblit服务端
  17. CSS基础【2】:CSS常见属性
  18. Python全栈之路----函数进阶----装饰器
  19. [转]Servlet的学习之Filter过滤器技术
  20. pkg-config命令的Makefile.am

热门文章

  1. 基于dns搭建eureka集群
  2. Linux入门:vi 和 vim
  3. kubernetes入门(10)kubernetes单机安装后 - helloworld
  4. api-gateway实践(10)新服务网关 - OpenID Connect
  5. Groovy入门(2-2)Groovy的eclipse插件安装
  6. NHibernate与IbatisNet的简单比较
  7. vue2路由
  8. python三元操作符
  9. Spring Cloud学习笔记-006
  10. 1102mysql关于SOCK文件的认识