函数值和javascript中的局部变量

时间:2011-04-25 05:12:53

标签: javascript

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);

一本书说

  

如果权力要自称,那就是   电话会引起新的,不同的   要创建和使用的结果变量   内心的呼唤,将离开   外部调用中的变量未受影响。

我不能很好地遵循它,期望有人可以向我解释。非常感谢

1 个答案:

答案 0 :(得分:3)

1

||的返回值不是布尔值。

如果它是真正的第一个参数,或者如果它不是第二个参数。

因此a || b相当于a ? a : ba && 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++);

这应该很清楚为什么它会警告它的作用。