var a = null;
function b() {return "B";}
(a || b)();
当我alert((a || b)());
时,它显示B。为什么? a || 的返回b
是 true 或 false。为什么上面返回的是B。
2:局部变量
function power(base, exponent) {
var result = 1;
for (var count = 0; count < exponent; count++)
result *= base;
return result;
}
power(2, 10);
一本书上说
if power were to call itself, that call would cause a new, distinct result variable to be created and used by the inner call and would leave the variable in the outer call untouched.
我不太明白,希望有人能给我解释一下。非常感谢
最佳答案
1.
||
的返回值不是 bool 值。
如果为真,则为第一个参数;如果不为真,则为第二个参数。
所以一个|| b
相当于 a ? a : b
和 a && b
相当于 a ? b:a
.
2.
当调用 power 时,一个新的帧会被推送到调用堆栈上,以像其他语言一样保存参数和局部变量。但 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 }
的堆栈帧,第一个计数器函数指向该堆栈帧。
用于初始化 c2
的第二次调用 makeCounter
创建了一个不同的堆栈帧。
所以上面的代码相当于
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++);
这应该清楚地表明为什么它会发出警报。
关于javascript - javascript 中的函数值和局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5775389/