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’)返回的结果。