这是一道昨天的面试题:
var num = 10;
var obj = {
num: 8,
inner: {
num: 6,
print: function(){
console.log("num: " + num + ", this.num: " + this.num);
}
}
}
num = 888;
下面语句输出什么?
- obj.inner.print();
- var fn = obj.inner.print;
fn(); - (obj.inner.print)();
- (obj.inner.print = obj.inner.print)();
感谢解答~
做这种面试题,要透过表象看本质啦,其中主要涉及的知识点有:
this
在函数中,如果函数调用时,有宿主对象(你这里的obj.inner
),则this
指向该对象,如果没有,则指向全局对象(这这里是window
,因为var num = xxx
在全局等价于window.num = xxx
),当然要除去apply/call/bind
以及箭头函数的干涉。js
中是对象,是引用类型,因此复制给一个变量时,会将引用进行赋值,所以fn
指向print
函数,而和它的层级没有关系()
是表达式,会计算括号中的值,所以这里的(obj.inner.print)
等价于obj.inner.print
,这里和赋值语句不同,赋值是语句,而括号是表达式,表达式会进行求值,而求值要先执行语句=
号赋值语句的返回值等于右边变量的值,所以(obj.inner.print = obj.inner.print)();
的值等价于指向obj.inner.print
的函数,这其实和第二题中一样我不得不吐槽一下,都
9102
年了,还要整这些实践性很低的题来考察候选人,这些东西用来丰富下技术积累也就可以了,当做面试题就有点那个了。