前端面试题-当中不注意的坑

关于闭包

问题一:下面程序的输出问题

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语法

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();
  • 感兴趣的朋友可以点链接去看看
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值