题目
能访问closure,但this值改变
因为obj.func("arg") = 返回的匿名函数,这个表达式明显是 windows
function closure(arg) {
var a = "closure";
console.log('a1:',a);//(1) closure
console.log('a2:',this);//(2) obj对象
return function () {
console.log('a3:',a);//(4) closure
console.log('a4:',arg); // (5) arg
console.log('a5:',this);//(6) window对象
}
}
var obj = {
func: closure
}
function func() {
obj.func("arg")();
console.log("funcEnd");// (3)funcEnd
}
func()
函数提升题目
var a = 100;
function test(){
console.log("a",a);
a = 10;
console.log("b",a);
}
test();
console.log("c",a);
/*
100, 10, 10
*/
2021.07.16面试
var a=10;
(function (){
console.log("1:",a)
a = 5;
console.log("2:",window.a)
var a = 20;
console.log("3:",a)
})()
/*
自己的答案:
undefined
5
20
*/
/*
实际答案:
1: undefined
2: 10
3: 20
*/
题目:结合this
var User = {
count: 1,
getCount: function() {
return this.count;
}
};
console.log(User.getCount());
var func = User.getCount;
console.log(func());
/*
1
undefined
*/
func是在window的上下文中被执行的,所以不会访问到count属性。
3-3.匿名函数的作用
- 若要创建一个闭包,往往都需要用到匿名函数。
- 模拟块级作用域,减少全局变量。执行完匿名函数,存储在内存中相对应的变量会被销毁,从而节省内存。
function fn(){
(function(){
var test = '匿名函数'
})();
console.log(test); // 报错
}
fn();
场景1:函数表达式
var fn = function(){
return "匿名函数"
}
// 调用方式与调用普通函数一样
console.log(fn());
场景2:回调函数
setInterval(function(){
console.log("匿名函数");
},1000);
场景3:将匿名函数作为返回值
function fn(){
var test = '匿名函数'
return function(){
return test;
}
}
//调用匿名函数
console.log(fn()());
//或
var box = fn();
console.log(box());