先看看一个简单的代码

var str='Hello World';
alert(str);//弹出 Hello World

再看一段代码:

var v='Hello World';
(function(){
alert(v);
})()
//和我们预期的一样,还是弹出 Hello World

那么铺垫完了,继续coding

var str='Hello World';
(function(){
alert(str);
var str='I love coding...';
})() //出乎我们的意料,弹出 undefined

继续…

var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
alert(foo);
}
bar();//

再来:

var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
alert(a); //

1.变量提升

就是把变量提升提到函数的top的地方。同时需要注意的是变量提升只是提升变量的声明,并不会把赋值也提升上来。比如:

(function(){
var a='One';
var b='Two';
var c='Three';
})()

实际上它是这样子的:

(function(){
var a,b,c;
a='One';
b='Two';
c='Three';
})()

那么现在我们分析下刚才出现很尴尬的结果

var str='Hello World';
(function(){
alert(str);
var str='I love coding...';
})()

其实,根据我么根据上面变量提升原件以及js的作用域(块级作用域)的分析,得知 上面代码真正变成如下:

var str='Hello World';
(function(){
var str;
alert(str);
str='I love coding...';
})()

所以,才会提示说 undefined

这里,我们应该受到启发:我们在写js code 的时候,我们需要把变量放在函数级作用域的顶端,比如我在上面所举的例子:var a,b,c;。以防止出现意外。

2.函数提升

函数提升是把整个函数都提到前面去。在我们写js code 的时候,我们有两种写法,一种是函数表达式,另外一种是函数声明方式。我们需要重点注意的是,只有函数声明形式才能被提升。例子说明:

function getName() {console.log(5)};
var getName = function() {console.log(4)};
getName()
var getName = function() {console.log(4)};
function getName() {console.log(5)};
getName()

执行上面的两块代码,会发现 打印的都是 4 而不是 5

//函数声明方式提升【成功】
function myTest(){
foo();
function foo(){
alert("我来自 foo");
}
}
myTest();// 我来自 foo
//函数表达式方式提升【失败】
function myTest(){
foo();
var foo =function(){
alert("我来自 foo");
}
}
myTest();//Uncaught TypeError: foo is not a function

3.作用域链

3.1变量必须先声明后使用,函数可以先使用、后声明

原因是:函数有预加载的过程(函数声明先于其他执行代码进入内存)。本质还是函数的声明在前,使用在后。

console.log(subject);//undefined
var subject="javascript";
//var命令会发生”变量提升“现象,
//即变量可以在声明之前使用,值为undefined //函数可以先使用、后声明
f1();//I am f1 function
function f1(){
console.log("I am f1 function");
}

注意:同名变量和同名函数同时存在的时候,分析其执行顺序即可,函数声明第一个执行,其他代码顺序执行。

//同名变量和同名函数同时存在的时候,
//分析其执行顺序即可,函数声明第一个执行,
//其他代码顺序执行。
var f1="subject";
f1();
function f1(){
console.log("I am f1 function");
}
//Uncaught TypeError: f1 is not a function
f1();//I am f1 function
var f1="subject";
console.log(f1);//subject
function f1(){
console.log("I am f1 function");
}

3.2 内部环境可以访问外部环境的变量,反之亦然。

环境:每一个函数内部都是一个环境,最外边是全局变量

两种类型:函数环境、全局环境

var week="Sunday";
function f1(){
var weather="sunshine";
console.log("星期:"+week); //星期:Sunday
}
f1();
console.log("气候:"+weather);//Uncaught ReferenceError: weather is not defined

3.3 变量的作用域是声明时决定的,而不是运行时。

//变量的作用域是声明时决定的,而不是运行时

//全局变量,可以同时给f1和f2访问
var week="Sunday";
function f1(){
console.log("星期:"+week);
}
function f2(){
//局部变量,只能给f2本身子级访问
var week="Monday";
f1();//该f1无论在任何地方访问,都只能访问到Sunday的信息
}
f2();//星期:Sunday
//变量的作用域是声明时决定的,而不是运行时 //全局变量,可以同时给f1和f2访问
var week="Sunday";
function f1(){
console.log("星期:"+week);
}
week="Monday";
f1();//星期:Monday

3.4 执行环境可以访问变量的类型和优先级

//执行环境可以访问变量的类型和优先级
//形参<外部变量 //形参优先级高
var week="Sunday";//外部变量
function f1(){
function f2(week){//形参
console.log("星期:"+week);
}
f2("Monday");
}
f1();//星期:Monday

js中的变量提升与函数提升的更多相关文章

  1. Js中有关变量声明和函数声明提升的问题

    在ECMAScript5中没有块级作用域一说,只有函数作用域和全局作用域,在其中声明的变量和函数和其他语言的展现形式不同,在某些情况下不一定需要先定义后使用,函数和变量的使用可以在其声明之前,这到底是 ...

  2. js中的变量提升和函数提升

    从上周开始,我所在的学习小组正式开始了angular的学习,angular是全面支持es6的,所以语法上和以前的angular有了很大的不同,比如变量声明时就抛弃了var,而选择了let和const: ...

  3. js中变量提升和函数提升

    变量提升和函数提升的总结 我们在学习JavaScript时,会遇到变量提升和函数提升的问题,为了理清这个问题,现做总结如下,希望对初学者能有所帮助 我们都知道 var 声明的变量有变量提升,而 let ...

  4. JS 变量提升与函数提升

    JS 变量提升与函数提升 JS变量提升 变量提升是指:使用var声明变量时,JS会将变量提升到所处作用域的顶部.举个简单的例子: 示例1 console.log(foo); // undefined ...

  5. js变量提升与函数提升的详细过程

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  6. JS——变量提升和函数提升

    一.引入 在了解这个知识点之前,我们先来看看下面的代码,控制台都会输出什么 var foo = 1; function bar() { if (!foo) { var foo = 10; } aler ...

  7. 谈谈javascript中的变量提升还有函数提升

    在很多面试题中,经常会看到关于变量提升,还有函数提升的题目,所以我就写一篇自己理解之后的随笔,方便之后的查阅和复习. 首先举个例子 foo();//undefined function foo(){ ...

  8. JS逻辑题 技术点: 1). 变量提升 2). 函数提升 3). 预处理 4). 调用顺序

    考查的技术点:  1). 变量提升 2). 函数提升  3). 预处理  4). 调用顺序 var c = 1; function c(c) { console.log(c); var c = 3; ...

  9. JavaScript系列文章:变量提升和函数提升

    第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函 ...

  10. JavaScript:变量提升和函数提升

    第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函 ...

随机推荐

  1. pycharm异常问题之Unable to save settings: Failed to save settings. Please restart PyCharm

    pycharm异常之Unable to save settings: Failed to save settings. Please restart PyCharm 今天一不小心将电脑关了,但是关机之 ...

  2. C#复习笔记(3)--C#2:解决C#1的问题(结束C#2的内容:最后一些特性)

    结束C#2的内容:最后一些新性 这是本章要讲的内容: 分部类型:可以在多个源文件中为 一个类型编写代码. 特别适用于部分代码是自动生成, 而其他部分的代码为手写的类型. 静态类:对工具类进行整理, 以 ...

  3. java的数据类型:基本数据类型和引用数据类型

    Java数据类型的基本概念 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式. 开始接触每种语言的时候,都会存在对数据类型的认识,有复杂的,有复杂的,各 ...

  4. Flutter之 LimitedBox、Offstage、OverflowBox、SizedBox详解

    1. LimitedBox A box that limits its size only when it's unconstrained. 1.1 简介 LimitedBox,通过字面意思,也可以猜 ...

  5. spring boot session error

    Error starting ApplicationContext. To display the conditions report re-run your application with 'de ...

  6. Python深入类和对象

    一. 鸭子类型和多态 1.什么是鸭子类型: 在程序设计中,鸭子类型(英语:Duck typing)是动态类型和某些静态语言的一种对象推断风格."鸭子类型"像多态一样工作,但是没有继 ...

  7. linux audit审计(6)--audit永久生效的规则配置

    定义reboot系统后,仍然生效的审计规则,有两种办法: 1.直接写入/etc/audit/audit.rules文件中,在service文件中需要加入ExecStartPost=-/sbin/aud ...

  8. Js返回上一页,刷新页面,定时刷新,改变地址栏 等常用实用技巧

    1. Javascript 返回上一页history.go(-1), 返回两个页面: history.go(-2); 2. history.back(). 3. window.history.forw ...

  9. How to remove unwant Explorer Context Menu

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell

  10. UVA 11988 Beiju Text

    https://vjudge.net/problem/UVA-11988 题目 你有一个破损的键盘.键盘上所有的键都可以正常工作,但有时候Home键或者End键会自动按下.你并不知道键盘存在这一问题, ...