为了账号安全,请及时绑定邮箱和手机立即绑定

请问这个面试题如何分析?

请问这个面试题如何分析?

慕容3067478 2018-08-03 17:29:15
var x = 20;var a = {    x: 15,    fn: function() {        var x = 30;        return function() {            return this.x;        };    }};console.log(a.fn());//function() {}console.log((a.fn())());//20console.log(a.fn()());//20console.log(a.fn()() === (a.fn())());//trueconsole.log(a.fn().call(this));//20console.log(a.fn().call(a));//15说下我的理解:a.fn返回的是一个函数,直接将函数打印出来返回1打印出的函数执行后的结果(为何this指向window还是无法理解)同2自执行函数(iife)的表示方法(function(){}())与function(){}()达到的是一样的效果,所以第四个console.log()打印出来的值是一样的this指代window,返回window.x也就是20返回a.x也就是15感觉还是理解不透彻,可否有高人指点一二?
查看完整描述

2 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

第二个为什么是20?不该指向a吗?

查看完整回答
反对 回复 2018-08-05
?
POPMUISE

TA贡献1765条经验 获得超5个赞

首先要明确的是this的几种指向情况。
不赘述了,看这里此处有链接
1.根据描述(a.fn())()执行的是哪个函数,执行的是(a.fun()),这个函数是a上的方法吗,有挂载的对象吗?没有,所以就属于对函数的直接调用,this就是window.
2.(a.fn())(),a.fn()()根据优先级执行顺序是一样的(可以点进去看),且结果都是20.
3.20===20,true.
4.call的用法主要就是改变调用的函数(方法)的this值,a.fn().call(this)中的this,应该是当前环境的this,就是windowa.fn().call(a)就是传了a作为函数执行的this.

补充:
1.a.fn是a上的方法,a.fn()是a上方法的调用,其返回值是一个函数,a.fn()()是对这个函数的调用,于a的关系仅仅是能访问a.fn内声明的变量(函数作用域在声明时确定)。
2.iife是(function())和(function())(),甚至!function()(),这些写法的功能都是讲函数声明变为函数表达式以可以直接调用而不保存。再看你说的a.fn()是函数声明吗?它就是对a.fn的一次调用,它就等于这次调用的返回值,就是一个单纯的函数。建议你先好好理解下返回值这个概念,再去查一下函数声明和函数表达式的区别。


查看完整回答
反对 回复 2018-08-05
  • 2 回答
  • 0 关注
  • 1000 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信