递归函数中的变量声明

时间:2016-07-30 03:41:14

标签: javascript recursion

我花了很长时间试图完成这个功能只是为了看到我正在尝试的语法没有被接受。

代码学院中的countSheep函数告诉您完成该函数并为您提供一个似乎未在本地范围内定义的newNumber变量。所以我试着给它" var"关键词。出于某种原因,我无法理解var关键字是不必要的,为了完成该功能并让它通过测试我必须使用以下内容:

而不是定义我刚才使用的变量 newNumber =数字-1; //也可以写成newNumber - = 1; 将newNumber传递给函数

OR

未定义newNumber变量,只使用n-1作为参数调用该函数。

这是代码学院给我们解决的代码。



function countSheep(number) {
  if (number === 0) {
    console.log("Zzzzzz");// Put your base case here
  } else {
	console.log("Another sheep jumps over the fence.");
	// Define the variable newNumber as 
	// 1 less than the input variable number
	newNumber = number - 1;
	// Recursively call the function
	// with newNumber as the parameter
	countSheep(newNumber);
  }
}




有人可以告诉我为什么在函数内部不需要var关键字来定义newNumber变量。我很感激。

2 个答案:

答案 0 :(得分:2)

  

如果您使用 var 声明 newNumber ,则只能访问   的范围   其他阻止

     

。但如果你不使用 var ,它就不会   local,表示可以在外部范围访问**(countSheep)。**

答案 1 :(得分:1)

newNumber是一个全局变量,意味着它被分配给全局对象。在浏览器中,这是window对象:

function f(x) {
  y = x;
}

console.log(window.y);
f(123);
console.log(window.y);

要创建只能在函数中访问的局部变量,请使用var

function f(x) {
  var y = x;
  console.log("within f:", y);
}

f(123);
console.log("outside f:", window.y);

要创建只能在其周围区域中访问的局部变量,请使用letconst

function f(x) {
  {
    let y = x;
    console.log("inside block", y);
  }

  try {y} catch (e) {console.log("outside block:", e.message)}
}

f(123);