ECMAScriptJavaScript中变量升高是语言设计缺陷

从前可以用 typeof == ‘undefined’,来判定是否引入了某lib,比如jQuery

#include <stdio.h>
int main() {
    int x = 1;
    printf("%d, ", x); // 1
}

但一旦想选拔那一个 func,则无可能

那强制程序员养成好的习惯,变量须求“先评释再拔取”,否则报错。

 

function test() {
    alert(f1); // function
    f1(); // "called"
    function f1() {
        alert('called');
    }
}
test();

相关:

 

故此,有类 C语言 经验的程序员,都很领悟变量须要
先注解后使用,不然会报错。而到了JS里,有 变量升高 现象,可以
先选拔后宣称,C 的阅历用到 JS 里迷惑便出现了。

Temporal_dead_zone_and_errors_with_let

 

四、 函数表达式也存在变量进步

function test() {
    alert(declaredButNotAssigned1); // 报异常
    alert(declaredButNotAssigned2); // 报异常
    alert(func); // 报异常

    let declaredButNotAssigned1;
    let declaredButNotAssigned2 = true;
    let func = function() {};
}
test();

In ECMAScript 6, let does not hoist the variable to the top of
the block. If you reference a variable in a block before
the let declaration for that variable is encountered, this results
in a ReferenceError, because the variable is in a “temporal dead
zone” from the start of the block until the declaration is processed.

function test() {
    alert(notDefined);
}
test(); // ?
function test() {
    alert(declaredAndAssigned); // undefined
    var declaredAndAssigned = 1;
}
test();

那会儿,编译都无法通过了。但JS里可以反过来写,见二、三。

 

变量进步:
在指定效用域里,从代码顺序上看是变量先使用后声称,但运行时变量的 “可访问性” 提高到眼前作用域的顶部,其值为
undefined ,没有 “可用性”。

JS
存在变量进步,这些的布置其实是恶性的,或者是言语达成时的一个副功用。它同意变量不申明就可以访问或声称在后使用在前。新手对于此则很迷惑,甚至许多利(多利)用JS多年老手也正如迷惑。但在
ES6 插手 let/const 后,变量Hoisting 就不设有了。

两句代码,先注脚整数型 x,
再出口。代码顺序和运转顺序是同样的,即健康运行。

用 let 声明变量后,typeof 却不再安全了

 

 

五、函数申明的名也会提高到眼前效果域顶部

二、三 都爆发了变量进步(Hoisting),不难定义

 

此间强调 “代码顺序” 和
“运行顺序”,是因为大多数时候大家写的代码都是逐一执行的,即 “代码顺序” 和
“运行顺序” 是同一的。那也切合人的大脑的思维进程。比如有过 C语言
经验的程序员

 

 

题1:

前面说了,变量进步(Hoisting)没什么用,属于语言的恶性设计,好的习惯仍然“先表明后使用”。这一个特性也会现出在许多大商厦面试题里

function test() {
    var declaredAndAssigned;
    alert(declaredAndAssigned); // undefined
    declaredAndAssigned = 1;
}

三、
变量声明在终极,同时给变量赋值

why-typeof-is-no-longer-safe

可访问性:alert(func),输出 undefined,可以运作,可以访问 func。

以下摘自MDN的有关let不在暴发变量升高的叙述

function test() {
    alert(func); // undefined
    func(); // 报异常
    var func = function() {};
}
test();
function test() {
    alert(declaredButNotAssigned); // undefined
    var declaredButNotAssigned;
}
test();

 

 

题2:

二、三、四 都是运用 var 声明的变量,JS 里函数注明也会设有提高,只是这些“变量” 相比十分,它是一个 function
类型(可以当做函数、方法或构造器)。它的名字(标识符)也会进步到眼前功能域的顶部。

// 判断jQuery是否引入了
if (typeof $ !== 'undefined') {
    // do something
}...

 

即把评释和赋值分为两句。

结果和 二 相同, 很明显,并不会因为赋值了就输出 1。

#include <stdio.h>
int main() {
    printf("%d, ", x); // error
    int x = 1;
}
if (condition) {
    alert(typeof num); // Error!
    let num = 100;
}

可用性:   func(), 报十分,不可能正常调用 func,表示无可用性。

二. 变量讲明在结尾

第一校正下,文章标题里的
变量ECMAScript,升高”
名词是随大流叫法,“变量提高” 改为
标识符晋级”
更规范。因为变量一般指使用 var 声明的标识符,JS 里使用 function
讲明的标识符也存在升高(Hoisting)。

 

JavaScript判断变量是否为undefined二种办法差别

jQuery没有引入,$
没有申明,那句也不会报错而影响到下边的代码执行,但如借使 let
注明的就会报错了。

输出 undefined,
结果比上例有所改正,没有报错,代码可以运行,但变量值可能不是程序员所期望的。

平日为了让大家明白起来不难些,把 三 拆成如下

 

 

// 写出以下代码的运行结果
var a = 1;
function fn() {
    a = 2;
    return;
    function a() {}
}
fn();
alert(a); // ?
// 写出以下代码的运行结果
var a = 1;
function fn() {
    if (!a) {
        var a = 2;
    }
    alert(a); // ?
}
fn();

 

一、 变量未声明,间接拔取

ECMAScript 1

 

结果func 是 undefined,调用 func 则会报非常。 在地点的定义中涉及了
可访问性可用性 对应如下语句。

 

报错是当然的

若果逐个反过来

function test() {
    alert(func); // undefined
    var func = function() {};
}
test();

但这所有随着 ES6 的 let/const 到来为止了,ES里除全局变量外,其余都施用
let/const,var 替换成 let 后变量升高就没有了。

 

大家看看,评释 f1 在代码最末,f1 使用在前,alert(f1) 和 f1()
都正常履行,表示 可访问性可用性 都有了。