var:
当在函数内部没有定义这个变成,默认就是在全局的上下文定义了一个var sum;
function add(num1, num2) { sum = num1 + num2; // var sum = num1 + num2 这个样的结果就是报错sum is not defined return sum; } let result = add(10, 20); // 30 console.log(sum); //30
变量提升
console.log(name); // undefined var name = 'Jake';
函数提升变量,可以把
function getName(){return 4};//函数声明 看错是声明加赋值的功能,函数表达式就只是一个声明赋值还是需要根据全局的上下文来执行的。
var getName = function(){return 2};//函数表达式 function getName(){return 4};//函数声明 console.log(getName());//2 console.log(getName());//4 var getName = function(){return 2};//函数表达式 console.log(getName());//2 function getName(){return 4};//函数声明
let:
就是块级作用域
const:
它和let的区别就是,首先当定义const的时候需要提前赋值,不能更改引用名和数值
const o1 = {}; o1 = {}; // TypeError: 给常量赋值 const o2 = {}; o2.name = 'Jake'; console.log(o2.name); // 'Jake'如果想让整个对象都不能修改,可以使用 Object.freeze(),这样再给属性赋值时虽然不会报错, 但会静默失败:
const o3 = Object.freeze({}); o3.name = 'Jake'; console.log(o3.name); // undefined
总结:
由于 const 声明暗示变量的值是单一类型且不可修改,JavaScript 运行时编译器可以将其所有实例 都替换成实际的值,而不会通过查询表进行变量查找。谷歌的 V8 引擎就执行这种优化。 这个实例就是前面o2.name这些当使用到了const这个引用名就是直接变成实际的值。开发中尽量的使用const。