function test() {alert(notDefined);}test(); // ?报错是自然的
二. 变量声明在末尾
function test() {alert(declaredButNotAssigned); // undefinedvar declaredButNotAssigned;}test();输出 undefined, 结果比上例有所改善,没有报错,代码可以运行,但变量值可能不是程序员所期望的。function test() {alert(declaredAndAssigned); // undefinedvar declaredAndAssigned = 1;}test();结果和 二 相同, 很明显,并不会因为赋值了就输出 1。#include <stdio.h>int main() {int x = 1;printf("%d, ", x); // 1}两句代码,先声明整数型 x, 再输出。代码顺序和运行顺序是一致的,即正常运行。#include <stdio.h>int main() {printf("%d, ", x); // errorint x = 1;}此时,编译都不能通过了。但JS里可以反过来写,见二、三。function test() {alert(func); // undefinedvar func = function() {};}test();但如果想使用这个 func,则无可能function test() {alert(func); // undefinedfunc(); // 报异常var func = function() {};}test();结果func 是 undefined,调用 func 则会报异常。 在上面的定义中提到了 可访问性 和 可用性 对应如下语句。function test() {alert(f1); // functionf1(); // "called"function f1() {alert("called");}}test();我们看到,声明 f1 在代码最末,f1 使用在前,alert(f1) 和 f1() 都正常执行,表示 可访问性 和 可用性 都有了。// 写出以下代码的运行结果var a = 1;function fn() {if (!a) {var a = 2;}alert(a); // ?}fn();题2:// 写出以下代码的运行结果var a = 1;function fn() {a = 2;return;function a() {}}fn();alert(a); // ?但这一切随着 ES6 的 let/const 到来结束了,ES里除全局变量外,其它都使用 let/const,var 替换成 let 后变量提升就不复存在了。function test() {alert(declaredButNotAssigned1); // 报异常alert(declaredButNotAssigned2); // 报异常alert(func); // 报异常 let declaredButNotAssigned1;let declaredButNotAssigned2 = true;let func = function() {};}test();这强制程序员养成好的习惯,变量需要“先声明再使用”,否则报错。if (condition) {alert(typeof num); // Error!let num = 100;} 以前可以用 typeof == "undefined",来判断是否引入了某lib,比如jQuery// 判断jQuery是否引入了if (typeof $ !== "undefined") {// do something}...jQuery没有引入,$ 没有声明,这句也不会报错而影响到下面的代码执行,但如果是 let 声明的就会报错了。