网页前端后台技巧(CSS+HTML)让前端飞Web前端之路

JavaScript必须要掌握的知识-作用域编写提升

2019-07-10  本文已影响3人  4fd9083a87a9

提升什么?

把变量与函数的声明移到编写所处作用域的最上面,叫作提升

如下代码:


console.log(name); // undefined
var name = 'Rewa Fang';
console.log(name); // Rewa Fang 


第一次打印name时,输出undefined而不是抛出异常ReferenceError。 正是因为变量name声明被提升了。 但只提升声明,赋值不会提升;所以输出undefined。 第二次打印时,name已经被赋值为Rewa Fang

提升后的代码:

var name;
console.log(name); // undefined
name = 'Rewa Fang';
console.log(name); // Rewa Fang 


代码改成下面这种写法也是可正常执行的:


name = 'Rewa Fang';
console.log(name); // Rewa Fang 
var name;

var name; 会被提升到最上面。

这是因为编译器在编译阶段会找到代码中所有的声明,并绑定在对应的作用域中。而赋值和其它逻辑代码会留在原地;等待执行。 比如: var a = 1; 会被编译器看作两个部分声明var a;和赋值a = 1; ,那么声明会提升到作用域最上面,赋值则在原地等执行。

包含函数声明也会提升。

函数声明提升


sayHi(); // Hello!
function sayHi(){
    console.log('Hello!');
}

函数sayHi()可以正常执行;因为函数声明的部分被提升了。提升为:


function sayHi(){
    console.log('Hello!');
}
sayHi(); // Hello!


函数内部的变量和函数也会提升至函数最上面:

var name = 'Lebron James';
sayHi(); // Hello! Rewa Fang
function sayHi(){
    name = 'Rewa Fang';
    console.log('Hello! '+name);
    var name;
}


函数内的name会提升至函数创建的作用域最上面,所以函数内部不会引用到外部name。 内部的name遮蔽了外部变量name。

提升后:


function sayHi(){
    var name;
    name = 'Rewa Fang';
    console.log('Hello! '+name);
}
var name;
name = 'Lebron James';
sayHi(); // Hello! Rewa Fang

提升后有一个变化,就是函数声明会优先于变量提升

比如:


console.log(sayHi);

var sayHi = 'Lebron James';

function sayHi(){
    console.log('Hello! ');
}


结果会输出:ƒ sayHi(){console.log('Hello! ');} node环境下输出:[Function: sayHi]

why ?

为什么需要提升?

有以下原因:

PS: ES6中 let const 不会被提升

多年编程经验,月初整理了一批2019年最新WEB前端教学视频,不论是零基础想要学习前端还是学完在工作想要提升自己,这些资料都会给你带来帮助,从最基础的HTML+CSS+JS【炫酷特效,游戏,插件封装,设计模式】资料都有整理,帮助所有想要学好前端的同学,学习规划、学习路线、学习资料、问题解答。只要加入WEB前端学习交流qun:767,273,102 ,即可免费获取,学习不怕从零开始,就怕从不开始。

上一篇 下一篇

猜你喜欢

热点阅读