这,编译都无克透过了。但JS里可回写,见第二、三。

function test() {
    alert(declaredButNotAssigned); // undefined
    var declaredButNotAssigned;
}
test();

平等、 变量未阐明,直接用

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

 

相关:

俺们看到,阐明 f1 在代码最末尾,f1 使用于面前,alert(f1) 和 f1()都正常执行,表示 但访问性可用性 都有了。

Temporal_dead_zone_and_errors_with_let

老三、
变量讲明在终极,同时于变量赋值

JavaScript判断变量是否也undefined两栽艺术差距

据此 let 表明变量后,typeof 却不再安全了

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

 

 

 

可用性:   func(), 报非凡,不克健康调用 func,表示无可用性。

唯独要想使此 func,则无论可能

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

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

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

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

 

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

老二、三、四 都是动 var 阐明的变量,JS 里函数申明也会存在进步,只是那一个“变量” 相比特殊,它是一个 function
类型(可以当作函数、方法还是构造器)。它的名字(标识符)也会升级至眼前效能域的顶部。

 

报错是当之

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

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

 

JS
存在变量提高,这多少个的计划性其实是拙劣的,或者是言语实现时的一个副成效。它同意变量无表明就得拜抑或讲明在晚下在前面。新手对于此则不行迷惑,甚至多采纳JS多年老资格也正如迷惑。但每当
ES6 参加 let/const 后,变量Hoisting 就未在了。

一般为为我们清楚起来容易些,把 三 拆成如下

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

 

结果和 二 相同, 很明显,连无晤面以赋值了就输出 1。

面前说了,变量提高(Hoisting)没什么用,属于语言的低劣设计,好的习惯或
“先阐明后使”。那么些特性也会面并发在众多异常集团面试题里

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

有限词代码,先注解整数型 x,
再出口。代码顺序与运行顺序是一模一样的,即健康运转。

 

如逐个反过来

二. 变量阐明在终极

jQuery没有引入,$
没有注脚,这词也无会师报错而影响到下的代码执行,但假诺是 let
阐明的哪怕会合报错了。

 

#include <stdio.h>
int main() {
    printf("%d, ", x); // error
    int x = 1;
}
function test() {
    alert(func); // undefined
    func(); // 报异常
    var func = function() {};
}
test();

 

唯独登时通就 ES6 的 let/const 到来了了,ES里除了全局变量外,另外都采纳let/const,var 替换成 let 后变量提高就消失了。

 

why-typeof-is-no-longer-safe

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

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.

首先纠正下,著作标题里之
变量升级”
名词是遵照大流叫法,“变量提高” 改也
标识符升级”
更确切。因为变量一般指利用 var 声明的标识符,JS 里用 function
注脚的标识符也在提升(Hoisting)。

这边强调 “代码顺序” 和
“运行顺序”,是坐多数辰光我们写的代码都是逐一执行之,即 “代码顺序” 和
“运行顺序” 是平等的。这吗契合人的大脑的思维过程。比如有了 C语言
经验的程序员

if (condition) {
    alert(typeof num); // Error!
    let num = 100;
}

 

结果func 是 undefined,调用 func 则会报那些。 在面的定义着涉及了
但访问性可用性 对诺如下语句。

因此,有类 C语言 经验的程序员,都充足了解变量需要
预先讲明后动,不然会报错。而至了JS里,有 变量提高 现象,可以
优先使用后声称,C 的经历用到 JS 里迷惑便出现了。

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

五、函数阐明的名叫吧会升级及手上打算域顶部

季、 函数表明式也在变量提高

就把表明与赋值分为两句。

 

变量提高:
在指定功效域里,从代码顺序及看是变量先将来声称,但运行时变量的 “可访问性” 进步至即效能域的顶部,其值为
undefined ,没有 “可用性”。

第二、三 都暴发了变量提高(Hoisting),简单定义

这强制程序员养成好的惯,变量需要“预先表明又运”,否则报错。

 

图片 1

 

 

题1:

function test() {
    alert(notDefined);
}
test(); // ?

以下摘自MDN的有关let不在发出变量提升的讲述

 

题2:

相关文章

网站地图xml地图