有趣的代码,持续更新...

1、原文链接

// 我挺喜欢最上边的评论的,虽然我不知道是否正确
<script>
var a = {n:1}; 
var b = a;  
a.x = a = {n:2};  // 可以更换 a.x = a = {n:2}看看
console.log(a.x);// --> undefined 
console.log(b.x);// --> [object Object] 
</script>

2、

function Foo() {
    var i = 0;
    return function() {
        console.log(i++);
    }
}

var f1 = Foo(),
    f2 = Foo();
f1(); // 0
f1(); // 1
f2(); // 0

(1)Function是引用类型:保存在堆中,变量f1,f2是保存在栈中;
(2)闭包:一个函数(产生新的作用域)定义的局部变量、子函数的作用域在函数内,但是一旦离开了这个函数,局部变量就无法访问,所有通过返回子函数到一个变量f1的方法,让f1指向堆中的函数作用域,这样可以使用局部变量i.
(3)过程:
第一次f1() :f1=Foo()中,先执行Foo(): i = 0,return值返回给f1
(f1指向子函数 f1()=function(){…..},因为子函数没有 定义i,所以向上找到父函数定义的 i: )并执行子函数 输出i=0,再自加 i =1(覆盖了父函数Foo 的 i值);

第二次f1() : 执行的是子函数 Function(){ ..},输出的是父函数 的 i=1,再自加 i =2;

第一次f2():同第一次f1(),不同的是 f2指向堆中一个新的对象 function(){ …},所有此i非彼i,输出i=0;

如果再次f2(),那么和第二次f1(),一样输出i=1;
3、

function showCase(value) {
  console.log(value)
  switch(value) {
    case 'a':
          console.log(value, 'a');
      console.log('1');
      break;
    case 'string':
      console.log('2');
      break;
    case undefined:
      console.log(3);
      break;
    case 'undefined':
      console.log('4');
      break;
    default:
      console.log('5');
      break;
  }
}

showCase(new String('a'));

结果是5,其原因是new返回一个对象。可以看看new String(‘a’)返回的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值