变量提升

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

alert(a);  // undefined
var a = 3;
alert(a); //

相当于:

var a;
alert(a); // undefined
a = 3;
alert(a); //

函数声明提升

foo();  // hello

function foo () {
alert("hello");
}

相当于:

var foo = function () {
alert("hello");
}; foo();

函数表达式:

alert(foo); // undefined
foo(); // TypeError: foo is not a function
var foo = function () {
alert("hello");
};

相当于:

var foo;
alert(foo); // undefined
foo(); // TypeError: foo is not a function
foo = function () {
alert("hello");
};

变量与函数名相同时

1)函数声明会置顶(置顶成函数表达式)
2)变量声明也会置顶  (函数表达式看成变量形式),(变量与函数置声明顶都是在当前作用域下)
3)函数声明比变量声明更置顶:(函数在变量上面)  变量赋值>函数声明>变量声明

4)变量和赋值语句一起书写,在js引擎解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置
5)声明过的变量不会重复声明(同一作用域下)

var a = 2;

var a = 3;

JS会默默忽略掉第二个var声明来将程序继续执行下去,而且后面声明的值会覆盖掉前面声明的值

如果重复声明的一个变量有初始值,那么它担当的不过是一个赋值语句的角色.

如果重复声明的一个变量没有初始值,那么它对原来的变量没有任何影响.

最终一切皆为声明变量,然后赋值形式(分解开来分析即可)

var a = 100;
function a () {
alert(100);
}
a(); // TypeError: a is not a function 

相当于:

var a = function () {
alert(1);
};
var a = 100;
a();

函数内部的变量提升与函数声明提升(提升到当前作用域顶部)

变量提升与函数声明提升不会超过参数

function fn (b) {
console.log(b);
function b () {
console.log(b);
}
b();
}
fn(10);

运行结果:

相当于:

function fn () {
var b = function () {
console.log(b);
};
console.log(b);
b();
}
fn(10);

一些题目:

1.

var a = 1;
function fn () {
if (!a) {
var a = 2;
}
alert(a);
}
fn(); //

2.

if (! "a" in window) {
var a = 1;
}
alert(a); // undefined

3.

var a = 1;
function fn() {
a = 2;
return;
function a() {}
}
fn();
alert(a); //

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

  1. js 函数提升和变量提升

    总结: 函数提升比变量提升优先级高! 词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 具体步骤如下: 函数在运行 ...

  2. Javascript中函数提升和变量提升

    词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active ...

  3. js 面试的坑:变量提升

    全局中的解析和执行过程 预处理:创建一个词法环境(LexicalEnvironment,在后面简写为LE),扫描JS中的用声明的方式声明的函数,用var定义的变量并将它们加到预处理阶段的词法环境中去. ...

  4. 转载 js函数声明和函数表达式

    在js中函数有两种表达方式.1 函数声明 2 函数表达式 函数声明 function sayname(){ alert("li lei"); } 函数表达式 var sayname ...

  5. [js]js的惰性声明, js中声明过的变量(预解释),后在不会重新声明了

    js的惰性声明, js中声明过的变量(预解释),后在不会重新声明了 fn(); // 声明+定义 js中声明过一次的变量,之后在不会重新声明了 function fn() { console.log( ...

  6. js函数声明外面使用小括号括起来再接一个小括号的写法

    js函数声明外面使用小括号括起来再接一个小括号的写法 (function(){})(); (function(){}()); !function(){}(); 总结ps:意思将函数声明变成,直接执行的 ...

  7. js中变量提升(一个是变量,一个是函数表达式都会存在变量提升,函数声明不存在)

    一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: ...

  8. JS函数提升和变量提升

    1.1什么是函数提升和变量的提升? JS引擎在运行整个JS代码的过程中,分为俩步. 第一步是读取和解析JS代码,第二部是执行. 在引擎解析JS代码的时候,当解析器遇见变量声明(var 变量名)和函数声 ...

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

    变量提升和函数提升: 就是将变量声明或者函数全部代码提升到当前作用域(全局作用域或函数作用域)最开始的部分. JavaScript中函数域为最小域范围:for循环.while循环.if语句.switc ...

随机推荐

  1. 长时间停留在calculating requirements and dependencies

    如果安装插件的时候,Eclipse花费了很长的时间calculating requirements and dependencies(计算需求和依赖性 )这个问题通常就是在点击安装之后显示“Calcu ...

  2. 深入理解java虚拟机(七)类加载的时机

    Class 文件中描述的各种信息都必须加载到虚拟机中才能运行和使用.而虚拟机怎么加载这些Class 文件呢?Class 文件进入到虚拟机中会发生什么变化呢? 虚拟机类加载机制是指 虚拟机把描述类的数据 ...

  3. Python 数据分析—第十章 日期处理

    日期时间数据类型及工具 from datetime import datetime now = datetime.now() print(now.year,now.month,now.day) #以毫 ...

  4. [LeetCode 题解]:Best Time to Buy and Sell Stock

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Say you ha ...

  5. c#设计模式系列:状态模式(State pattern)

    引言 我们在编程的时候,有时候会遇到,一个对象的行为动作会由对象的状态来决定的,也就是对象的行为是由状态来决定,如果对象的状态很多,那么也会由很多不同的行为,这时候我们一班会 if –else if- ...

  6. MySQL不带where条件的UPDATE和DELETE 限制操作说明

    本文来自 网易云社区 . 数据安全是业务的基石,但是DBA 总会遇到救火情况,业务误删除全表或者误更新错全表业务数据,导致服务不可用 sql_safe_updates参数可以限制不带where条件的u ...

  7. Maven项目编译时报错缺少tools.jar

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default ...

  8. IO模型《四》多路复用IO

    多路复用IO(IO multiplexing) IO multiplexing这个词可能有点陌生,但是如果我说select/epoll,大概就都能明白了.有些地方也称这种IO方式为事件驱动IO (ev ...

  9. PHP实现用户在线状态检测

    这个是基于ThinkPHP框架的,其他的可以自己根据需求改 1.先新建一个tags.php文件,放在配置目录Conf下. <?php  /*  * 添加行为  *  */  return arr ...

  10. codis__数据迁移和伸缩容

    数据迁移命令 注意点:是迁移到某个 redis-group 而不是某个redis-servers  实例 伸缩容用法 redis 内存等不够用时 增容 : 增加redis-group, 然后迁移使用上 ...