面试题一:
function fun(n, o) {
console.log(o);
return {
fun: function (m) {
return fun(m, n)
}
}
}
var a = fun(0)
a.fun(1)
a.fun(2)
a.fun(3)
var b = fun(0).fun(1).fun(2).fun(3)
var c = fun(0).fun(1)
c.fun(2)
c.fun(3)
面试题二:
链接:https://www.nowcoder.com/questionTerminal/ca2472f3581c467fb81a7a77b47ab740
来源:牛客网
//输出0 1 0function Foo() {
``var i = ``0``;
``return
function() {
``console.log(i++);
``}
}
var f1 = Foo(),
``f2 = Foo();
f1();
f1();
f2();
这道题考察闭包和引用类型对象的知识点:
1.一般来说函数执行完后它的局部变量就会随着函数调用结束被销毁,但是此题foo函数返回了一个匿名函数的引用(即一个闭包),它可以访问到foo()被调用产生的环境,而局部变量i一直处在这个环境中,只要一个环境有可能被访问到,它就不会被销毁,所以说闭包有延续变量作用域的功能。这就好理解为什么:
1 2 |
f1();``//0 f1();``//1 |
---|---|
2.我一开始认为f1和f2都=foo()是都指向了同一个function引用类型,所以顺理成章就会答错认为:
1 | f2();``//2 |
---|---|
但其实foo()返回的是一个匿名函数,所以f1,f2相当于指向了两个不同的函数对象,所以结果也就顺理成章的变为:
1 | f2();``//0 |
---|---|