1.break和continue有什么区别?
共同点:break和continue都用于循环控制,但他们的工作方式有所不同。
区别:
(1). Break: 当循环遇到break语句时,它会立即终止当前正在执行的循环,并且完全跳出该循环,不再执行剩下的迭代。此外,程序将继续执行break语句后面的代码(如果有的话)。
(2) Continue: 当循环遇到continue语句时,它会立即停止当前的这一次迭代,并且跳过余下的当前循环体中的代码,直接开始下一次迭代。所以,continue语句只会跳出当前的一次循环,而不是像break那样完全跳出整个循环。
总的来说,break用于完全结束一个循环,而continue用于跳过当前循环中的某一次迭代。
break/continue
支持循环前的标签。标签是 break/continue
跳出嵌套循环以转到外部的唯一方法。
outer: for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { let input = prompt(`Value at coords (${i},${j})`, ''); // 如果是空字符串或被取消,则中断并跳出这两个循环。 if (!input) break outer; // (*) // 用得到的值做些事…… } } alert('Done!');
// 函数声明 function sum(a, b) { return a + b; }
函数表达式:在一个表达式中或另一个语法结构中创建的函数。下面这个函数是在赋值表达式 =
右侧创建的:
// 函数表达式 let sum = function(a, b) { return a + b; };
函数表达式是在代码执行到达时被创建,并且仅从那一刻起可用。
一旦代码执行到赋值表达式 let sum = function…
的右侧,此时就会开始创建该函数,并且可以从现在开始使用(分配,调用等)。
函数声明则不同。
在函数声明被定义之前,它就可以被调用。
例如,一个全局函数声明对整个脚本来说都是可见的,无论它被写在这个脚本的哪个位置。
这是内部算法的缘故。当 JavaScript 准备 运行脚本时,首先会在脚本中寻找全局函数声明,并创建这些函数。我们可以将其视为“初始化阶段”。
在处理完所有函数声明后,代码才被执行。所以运行时能够使用这些函数。
根据经验,当我们需要声明一个函数时,首先考虑函数声明语法。它能够为组织代码提供更多的灵活性。因为我们可以在声明这些函数之前调用这些函数。
这对代码可读性也更好,因为在代码中查找 function f(…) {…}
比 let f = function(…) {…}
更容易。函数声明更“醒目”。
……但是,如果由于某种原因而导致函数声明不适合我们,那么应该使用函数表达式。
总结
- 函数是值。它们可以在代码的任何地方被分配,复制或声明。
- 如果函数在主代码流中被声明为单独的语句,则称为“函数声明”。
- 如果该函数是作为表达式的一部分创建的,则称其“函数表达式”。
- 在执行代码块之前,内部算法会先处理函数声明。所以函数声明在其被声明的代码块内的任何位置都是可见的。
- 函数表达式在执行流程到达时创建。
在大多数情况下,当我们需要声明一个函数时,最好使用函数声明,因为函数在被声明之前也是可见的。这使我们在代码组织方面更具灵活性,通常也会使得代码可读性更高。
所以,仅当函数声明不适合对应的任务时,才应使用函数表达式。
4.箭头函数
箭头函数的创建:不需要使用关键字 function,可以使用 => 符号创建函数
let func = (arg1, arg2, ..., argN) => expression;
这里创建了一个函数 func
,它接受参数 arg1..argN
,然后使用参数对右侧的 expression
求值并返回其结果。
换句话说,它是下面这段代码的更短的版本:
let func = function(arg1, arg2, ..., argN) { return expression; };
箭头函数对于简单的操作很方便,特别是对于单行的函数。它具体有两种形式:
- 不带花括号:
(...args) => expression
—— 右侧是一个表达式:函数计算表达式并返回其结果。如果只有一个参数,则可以省略括号,例如n => n*2
。 - 带花括号:
(...args) => { body }
—— 花括号允许我们在函数中编写多个语句,但是我们需要显式地return
来返回一些内容。