azl397985856 / fe-interview

宇宙最强的前端面试指南 (https://lucifer.ren/fe-interview)
Apache License 2.0
2.84k stars 260 forks source link

【每日一题】- 2019-11-18 - 以下代码输出什么? #63

Closed azl397985856 closed 4 years ago

azl397985856 commented 4 years ago

image

plain text:

var length = 10;

function fn () {
    console.log(this.length);
}

var obj = {
    length: 5,
    method: function (fn) {
        fn();
        arguments[0]();
    }
};

obj.method(fn, 1);

image

var obj = {
    num:8,
    inner: {
        num: 6,
        print: function () {
            console.log(this.num);
        }
    }
}
num = 888;
obj.inner.print(); 
var fn = obj.inner.print;
fn(); 
(obj.inner.print)(); 
(obj.inner.print = obj.inner.print)();
HEternally commented 4 years ago

题1:输出 10 2; 解1:函数fn为引用数据类型,故传入method方法中的fn其实是指向外部函数fn的地址; 输出2是因为此时调用的是数组的length属性,返回数组长度;

题2: 6 888 6 888 解2: 前两个应该都知道,就讲下后两个吧 首页要知道,圆括号的运算符优先级是大于函数调用的 所以(obj.inner.print)()先运行圆括号内的,而print方法是属于引用数据类型,即等价于obj.inner.print()输出6; (obj.inner.print = obj.inner.print)() 先运行(obj.inner.print = obj.inner.print) 返回值是print函数,然后执行函数,此时this指向window