1、作者反复用的side effect
side effect就是对世界造成的改变,例如说打印某些东西到屏幕,或者以某种方式改变机器的内部状态从而影响到后面的语句。
造成side effect的例子,例如下面的makeNoise 函数:
const makeNoise = function() { console.log("Pling!"); }; makeNoise(); // → Pling!
没有造成side effect的语句:
1; !false;
2、关于return
不论是不写还是 返回空return; 结果都是返回undefined
如果用let和const,那么变量的作用域和java等语言没有什么不同(局部可见性、同名屏蔽全局变量)。
但是倘若使用var ,那么在括号里定义的变量在括号外也可见:
<script type="text/javascript"> let x = 10; if (true) { let y = 20; var z = 30; console.log(x + y + z); // → 60 } // y 在这里是不可见的 // 强行使用 ReferenceError: y is not defined console.log(x + z); // → 40 </script>
引用知乎张正诚:
使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象;
使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升;
使用const声明的是常量,在后面出现的代码中不能再修改该常量的值。
PS. 在2015年之前的JavaScript中,只有函数创建了新的scope。
① 传统方式 ---- let/const f = function(xxxxx)
函数本身也是一种值,具备其它值的特征:
const future = function() { return "You'll never have flying cars"; };
注意在 } 之后需要分号。
‘② 自动变成当前scope(在某个{} 内或者全局)有效,无视定义函数的位置
console.log("The future says:", future()); function future() { return "You'll never have flying cars"; }
③ 省事的写法 ...
const power = (base, exponent) => { let result = 1; for (let count = 0; count < exponent; count++) { result *= base; } return result; }; const square1 = (x) => { return x * x; }; const square2 = x => x * x; const horn = () => { console.log("Toot"); }; let h = a => a % 3;
6、Exercises
计算字符数:
const countBs = function(x) { let count = 0; for (let i = 0; i != x.length; ++i) { if (x[i] == 'B') count++; } return count; }; const countChar = (a, b) => { let count = 0; for (let i = 0; i != a.length; ++i) { if (a[i] == b) count++; } return count; } console.log(countBs("BBC")); console.log(countChar("kakkerlak", "k"));