定义函数

函数定义是一个常规绑定,其中绑定的值是一个函数。 例如,这段代码定义了 square ,来引
用一个函数,它产生给定数字的平方:

const square = function(x) {

return x * x;

};

console.log(square(12));

// → 144


函数使用以关键字 function 起始的表达式创建。 函数有一组参数(在本例中只有 x )和一
个主体,它包含调用该函数时要执行的语句。 以这种方式创建的函数的函数体,必须始终包
在花括号中,即使它仅包含一个语句。
一个函数可以包含多个参数,也可以不含参数。在下面的例子中, makeNoise 函数中没有包
含任何参数,而 power 则使用了两个参数:

var makeNoise = function() {

console.log("Pling!");

};

makeNoise();

// → Pling!

const power = function(base, exponent) {

let result = 1;

for (let count = 0; count < exponent; count++) {

result *= base;

}

return result;

};

console.log(power(2, 10));

// → 1024


有些函数会产生一个值,比如 power 和 square ,有些函数不会,比如 makeNoise ,它的唯一
结果是副作用。 return 语句决定函数返回的值。 当控制流遇到这样的语句时,它立即跳出
当前函数并将返回的值赋给调用该函数的代码。 不带表达式的 return 关键字,会导致函数返
回 undefined 。 没有 return 语句的函数,比如 makeNoise ,同样返回 undefined 。
函数的参数行为与常规绑定相似,但它们的初始值由函数的调用者提供,而不是函数本身的
代码。
绑定和作用域
每个绑定都有一个作用域,它是程序的一部分,其中绑定是可见的。 对于在任何函数或块之
外定义的绑定,作用域是整个程序 - 您可以在任何地方引用这种绑定。它们被称为全局的。
但是为函数参数创建的,或在函数内部声明的绑定,只能在该函数中引用,所以它们被称为
局部绑定。 每次调用该函数时,都会创建这些绑定的新实例。 这提供了函数之间的一些隔离

  • 每个函数调用,都在它自己的小世界(它的局部环境)中运行,并且通常可以在不知道全局三、函数37环境中发生的事情的情况下理解。用 let 和 const 声明的绑定,实际上是它们的声明所在的块的局部对象,所以如果你在循环中创建了一个,那么循环之前和之后的代码就不能“看见”它。JavaScript 2015 之前,只有函数创建新的作用域,因此,使用 var 关键字创建的旧式绑定,在它们出现的整个函数中内都可见,或者如果它们不在函数中,在全局作用域可见。
let x = 10;
if (true) {
let y = 20;
var z = 30;
console.log(x + y + z);
// → 60
}
// y is not visible here
console.log(x + z);
// → 40
  • 每个作用域都可以“向外查看”它周围的作用域,所以示例中的块内可以看到 x 。 当多个绑定具有相同名称时例外 - 在这种情况下,代码只能看到最内层的那个。 例如,当 halve 函数中的代码引用 n 时,它看到它自己的 n ,而不是全局的 n 。
• const halve = function(n) {
return n / 2;
}
let n = 10;
console.log(halve(100));
// → 50
console.log(n)