JavaScript 题目(作用域)
2024-09-29 04:08:56
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)一下,或许就能明白了
以上为个人理解,如有纰漏或错误忘留言指正。
最新文章
- ASP.NET MVC Autofac自动注入
- 3、Android Intent Flag的介绍
- 深入理解Java虚拟机之读书笔记二 垃圾收集器
- Visual Studio中编写C程序
- Linux下面使用rpm命令
- 杭电hdoj题目分类
- jmeter生成报告指示板
- js中关于事件处理函数名后面是否带括号的问题
- .NET下解析Json的方法
- 第十二篇、高度自适应的textView
- 仿猪八戒一个提示(jQuery插件) v0.1 beta
- POJ1679(次小生成树)
- Thrift实现C#通讯服务程序
- Linux:用at和crontab调度作业
- LeetCode题解之Sum Root to Leaf Numbers
- windows安装gitblit服务端
- CSS基础【2】:CSS常见属性
- Python全栈之路----函数进阶----装饰器
- [转]Servlet的学习之Filter过滤器技术
- pkg-config命令的Makefile.am