1. function f5() {
f=ff();
return f;
function ff() {
return "f" in window;
};
var f;
}
console.log(f5());
解释:f5是全局下的函数,但是ff是函数下的私有函数,是一个闭包,验证f是否属于window,返回false,所以f再返回给f5函数之外,则是输出是false
--------------------
2. var a = 9;
function ss() {
a = 0;
return function (b) {
return b + (a++)
}
}
var f = ss();
var m = f(5);
console.log(m);
var n = ss()(5);
console.log(n);
var x = f(5);
console.log(x);
console.log(a);
解释:函数体内a=0,但是没有var声明,所有全局变量a变成了0,这是一个闭包,return b + (a++)是后++就变成了5+0,所有第一个m输出5;第二个原理和第一个一样所以n输出5;但是f(5)已经被调用过一次所以a的值没销毁,return b + (a++)是后++就变成了5+1,所以x输出6;原先a=0,但是被调用两次,所以a输出2.
--------------------
3.var aa=20;
function bind() {
var aa=12;
function fn() {
console.log(this.aa);
}
box.οnclick=function () {
fn();
}
}
box.onclick();
解释:bind和fn形成闭包,全局变量aa=20,局部变量aa=12,fn调用的应为局部变量下的aa,所以输出12;box绑定的点击事件无法在函数外执行,所以报错。
--------------------
4. function fn(b) {
console.log(b);
if(1!=2){
console.log(b);
function b() {
console.log(b);
}
b();
console.log(b);
}
console.log(b);
b()
}
fn(1);
解释:因为fn(1),将形参b赋值成1,所以第一次输出1;if(1!=2)结果为true,function在内存中完成了声明和定义,所以第二次输出函数体;当调用b(),第三次输出是函数体;第四次输出还是在if里最后执行输出的也是函数体;因为最后输出的是fn()的b,在if外函数执行完毕会自动销毁,所以输出b的值为1,调用b()没有函数了,所以报错。
--------------------