[TOC]
关于闭包
问题一:下面程序的输出问题
for(var i=1;i<5;++i){
setTimeout(function timer(){
console.log(i);
},i*1000);
}
- 这个是最简单的一个,i会每秒输出一个5
- 解决的方式很简单,就是用闭包
for(var i=1;i<5;++i){
(function(i){
setTimeout(function timer(){
console.log(i);
},i*1000);
})(i);}
- 利用ES6 let-闭包的块级作用域解决
for(let i=1;i<5;++i){
setTimeout(function timer(){
console.log(i);
},i*1000);}
问题二:下面程序输出什么
var name = 'global';
var obj = {
name : 'obj',
dose : function(){
this.name = 'dose';
return function(){
return this.name;
}
}
}
alert(obj.dose().call(this))
//alert(obj.dose().call(obj)) 这样写能看出区别了```
* 这道题还是非常简单的,但是一看到call,bind,apply之类的心就一紧,可能一慌张就答错了
**问题三:**在ES5中如何实现常量
* 这个问题一听我就呵呵了,如何定义呢?没错,还是用闭包
* 实现的思路:把原来的参数隐藏。再利用闭包的特性,将参数存在内存中,这样参数不会消失,也不能被更改
var consts=(function(){
var constant=10;
var p={};
p.get_consts=function(){
return constant;
}
return p;
})();
var gconst=consts.get_consts();
**问题四:**下面程序的输出结果
* 参考
>http://developer.51cto.com/art/201511/498268.htm
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);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined,?,?,?
* 估计大部分人都看过,但是当我初次见面之时,还是被吓到了。哎,心理承受估计有点差了,答案就不贴了。感兴趣的自己试试
## 关于JS语法
* 这道题我做的时候,是真的炸了,有几个没答对
* 参考
> http://www.cnblogs.com/xxcanghai/p/5189353.html
function Foo() {
getName = function () {
alert (1);
};
return this;
}
Foo.getName = function () {
alert (2);
};
Foo.prototype.getName = function () {
alert (3);
};
var getName = function () {
alert (4);
};
function getName() {
alert (5);
}
//请写出以下输出结果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
* 感兴趣的朋友可以点链接去看看