Skip to main content

题目

能访问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.匿名函数的作用

  1. 若要创建一个闭包,往往都需要用到匿名函数。
  2. 模拟块级作用域,减少全局变量。执行完匿名函数,存储在内存中相对应的变量会被销毁,从而节省内存。
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());