文档章节

面试题之arguments[0]()

m
 musishui
发布于 2017/07/08 09:31
字数 433
阅读 16
收藏 0

题目

var length = 10;
function fn(){
    console.log(this.length)
}
var obj = {
    length: 5,
    method: function(fn) {
        arguments[0]()
    }
}
obj.method(fn)

// 这段代码中最终输出什么?
// fn 指向 this的指向是谁?

答疑

这里没有输出 5,也没有输出 10,反而输出了 1,有趣。这里 arguments 是javascript的一个内置对象,是一个类数组(就是长的比较像数组,但是欠缺一些数组的方法,可以用slice.call转换成数组),其存储的是函数的参数。也就是说,这里arguments[0]指代的就是你method函数的第一个参数:fn,所以arguments0的意思就是:fn()。不过这里有个疑问,为何这里没有输出5呢?我method里面用this,不应该指向obj么,至少也会输出10呀,这个1是闹哪样?实际上,这个1就是arguments.length,也就是本函数参数的个数。为啥这里的this指向了arguments呢?因为在Javascript里,数组只不过使用数字做属性名的方法,也就是说:arguments0的意思,和arguments.0()的意思差不多(当然这么写是不允许的),你更可以这么理解:

arguments = {
    0: fn, //也就是 functon() {alert(this.length)} 
    1: 第二个参数, //没有 
    2: 第三个参数, //没有
    ..., 
    length: 1 //只有一个参数
}

所以这里 alert 出来的结果是 1

如果要输出 10 应该咋写呢?

var length = 10;
function fn(){
    console.log(this.length)
}
var obj = {
    length: 5,
    method: function(fn) {
        fn()
    }
}
obj.method(fn)

如果要输出 5 应该咋写呢?

var length = 10;
function fn(){
    console.log(this.length)
}
var obj = {
    length: 5,
    method: fn
}
obj.method()

或者

var length = 10;
function fn(){
    console.log(this.length)
}
var obj = {
    length: 5,
    method: function(fn) {
        fn.call(obj)
        // fn.call(this)
    }
}
obj.method(fn)

扩展

var length = 5
function fun(){
    console.log(this.length)
}
var arr = [fun]

fun()     // ?
arr[0]()  // ?

参考

https://www.zhihu.com/question/21466212

© 著作权归作者所有

共有 人打赏支持
m
粉丝 1
博文 18
码字总数 13887
作品 0
朝阳
【追寻javascript高手之路01】javascript参数知多少?

前言 我最近在思考一个问题,我本身平时还是积累了不少东西,面试时候问的东西基本逃不出写的博客(当然,高级阶段的就不行了),但是真的被问到时我却不一定答得上来。 知道且能回答,回答的...

范大脚脚
2017/12/08
0
0
西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分

最近我参加了一次来自西安的电话面试(第二轮,技术面),是大厂还是小作坊我在这里按下不表,先来说说这次电面给我留下印象较深的几道面试题,这次先来谈谈Vue的数据双向绑定原理。 情景再现...

闰土大叔
04/25
0
0
Spring Boot配置加载顺序

如果加载的配置有重复的,它们的加载顺序是这样的,数字越小的优先级越高,即优先级高的覆盖优先级低的配置。 Devtools global settings properties on your home directory (~/.spring-boot...

架构之路
2017/12/04
0
0
半年工作经验今日头条和美团面试题面经分享!!!!!

2018-5-21日昨天,下着小雨去面试了,特地避开雨天,竟然还是雨天,宝宝不想说话。。。 正好2点到,先去字节跳动,一进去就是客厅沙发桌子,旁边有书架和书,摆设一般,一点都感受不出大公司...

假烟景满舟
05/22
0
0
如何面试一个前端开发者?

本文由伯乐在线 -塔塔 翻译。未经许可,禁止转载! 英文出处:Sourcing。欢迎加入翻译组。 我在Twitter和Stripe这两家公司工作期间会负责一些前端开发者的面试。在面试过程中我们有很大的决定...

伯乐在线
2014/03/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

你为什么在Redis里读到了本应过期的数据

一个事故的故事 晚上睡的正香突然被电话吵醒,对面是开发焦急的声音:我们的程序在访问redis的时候读到了本应过期的key导致整个业务逻辑出了问题,需要马上解决。 看到这里你可能会想:这是不...

IT--小哥
今天
2
0
祝大家节日快乐,阖家幸福! centos GnuTLS 漏洞

yum update -y gnutls 修复了GnuTLS 漏洞。更新到最新 gnutls.x86_64 0:2.12.23-22.el6 版本

yizhichao
昨天
5
0
Scrapy 1.5.0之选择器

构造选择器 Scrapy选择器是通过文本(Text)或 TextResponse 对象构造的 Selector 类的实例。 它根据输入类型自动选择最佳的解析规则(XML vs HTML): >>> from scrapy.selector import Sele...

Eappo_Geng
昨天
4
0
Windows下Git多账号配置,同一电脑多个ssh-key的管理

Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有...

morpheusWB
昨天
5
0
中秋快乐!!!

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部