azl397985856/fe-interview

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

Closed this issue · 1 comments

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)();

题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