var a = null;
function b() {return "B";}
(a || b)();
当我alert((a || b)());
。它显示B.为什么? a || b
的返回是真是假。为什么以上返回B。
2:局部变量
function power(base, exponent) {
var result = 1;
for (var count = 0; count < exponent; count++)
result *= base;
return result;
}
power(2, 10);
一本书说
如果权力要自称,那就是 电话会引起新的,不同的 要创建和使用的结果变量 内心的呼唤,将离开 外部调用中的变量未受影响。
我不能很好地遵循它,期望有人可以向我解释。非常感谢
答案 0 :(得分:3)
1
||
的返回值不是布尔值。
如果它是真正的第一个参数,或者如果它不是第二个参数。
因此a || b
相当于a ? a : b
而a && b
相当于a ? b : a
。
2
当调用电源时,新帧被推入调用堆栈以保存参数和本地变量,如其他语言。但JavaScript与许多语言略有不同,因为当函数调用导致创建新的函数实例时,新函数实例在创建时保持对堆栈上的堆栈帧的引用。由于这些堆栈帧包含本地,因此对于通过对同一函数的不同调用创建的函数,内存中存在不同的位置。
例如,在
中function makeCounter() {
var counter = 0;
return function () { return counter++; };
}
var c1 = makeCounter();
var c2 = makeCounter();
c1(); c1(); c1();
c2(); c2();
alert(c1() + ", " + c2()); // -> 3, 2
alert(c1() + ", " + c2()); // -> 4, 3
首先调用 makeCounter
来初始化c1
。这会创建第一个计数器功能指向的堆栈帧,如{ counter: 0 }
。
第二次调用makeCounter
用于初始化c2
会创建一个不同的堆栈帧。
所以上面的代码相当于
var c1SFrame = { counter: 0 };
var c2SFrame = { counter: 0 };
c1SFrame.counter++; c1SFrame.counter++; c1SFrame.counter++;
c2SFrame.counter++; c2SFrame.counter++; c2SFrame.counter++;
alert(c1SFrame++ + ", " + c2SFrame++);
alert(c1SFrame++ + ", " + c2SFrame++);
这应该很清楚为什么它会警告它的作用。