基础知识 

在这个课题开始之前我们先做一些基础知识的讲解

1、在顶级的区域内声明的变量为 window级别的变量。 也就是说var a=100 等价于 window.a=100;

2、局部的重新声明变量没有意义。var a=100;var a;后面的将没有意义。

3、在有参数函数的定义中 function abc(p1){} abc(1),在函数执行中,先构建,在执行,会有两个步骤,所以说当函数执行之前构建过程中,将临时生成代码 var p1=1;将来一切不赋值的声明将变得没有意义。

var p1;//没有意义

var p1=2;//有意义。

开始进入正题

全局作用域和局部作用域

全局作用域:整个JS执行环境

局部作用域:通过创建一个函数就开辟出了一个局部作用域

全局变量和 局部变量

全局变量:在全局作用域都可以访问的变量

局部变量:只能在当前局部作用域访问的

变量声明提升:

如果变量声明在函数里面,则将变量声明提升到函数的开头

如果变量声明是一个全局变量,则将变量声明提升到全局作用域的开头

变量运行(搜索)机制:

首先看,有没有局部作用域

如果有,查找是不是这个局部作用域定义的变量

如果不是,寻找上一级作用域,直到找到全局作用域

如果全局作用域也找不到这个变量,这个变量就是未定义的 undefined

第一题:

var a=1;
function test(){
console.log(a);
var a=1;
}
test();

根据变量声明提升和变量搜索机制,函数test()应为

function test(){
var a;
console.log(a);//此时由于a并咩有被赋值,所以也就是undefined
a=1; }

第二题:

var b=2;
function test2(){
window.b=3;
console.log(b);//值为3
}
test2();

任何通过附加在window上的变量都相当于声明一个全局变量,或者是给全局变量赋值

第三题:

c=5;
function test3(){
window.c=3;
console.log(c);
var c;
console.log(window.c);
}
test3();

根据变量声明提升和变量搜索机制:

c=5;//声明一个全局变量c
function test3(){
var c;//变量声明提升,声明一个局部变量
window.c=3;//改变全局变量c的值
console.log(c);//由于此时的c是一个局部变量c,并且没有被赋值 c就是undefined
console.log(window.c);//此时的c就是一个全局变量c,也就是值为3
}
test3();

一言难尽的js变量提升的更多相关文章

  1. js 变量提升+方法提升

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

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

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

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

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

  4. JS变量提升和作用域

    一.JS变量提升 1.当浏览器引擎解析js代码时,将js中的所有一开始就是var声明的和function声明的都提升到全局.此时又叫全局作用域 console.log(aa); console.log ...

  5. js变量提升的坑

    关于js变量提升 变量提升 在js函数内部是可以直接修改全局的变量的,个人感觉是不好的设计, 但是确实存在这个概念 原理: 先查看有没有函数变量bb 查看形参有没有bb 查看全局有没有bb 报错, 找 ...

  6. js 变量提升和函数提升原理

    关于js的变量,开始的时候我们都会被告知,变量声明应该在引用该变量之前.关于为什么要这样做呢,开始的时候本着会用就行的目的,也没去深究.不过后来经常会发现一些让人很费解的..姑且称为现象吧.先看一段代 ...

  7. 关于JS变量提升的一些坑

    function log(str) { // 本篇文章所有的打印都将调用此方法 console.log(str); } 函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部 变量声明.命名 ...

  8. JS 变量提升

    var a = 1; function foo() { console.log(a); var a = 2; } foo(); //undefined 根据变量提升机制,最后得出undefined; ...

  9. js变量提升与函数提升

    在es6之前,js语言并没有块级作用域,即{}形成的作用域,只有全局作用域和函数作用域,所谓的提升,即是将该变量的声明或者函数的声明提升,举个例子 console.log(global); //und ...

随机推荐

  1. 20165232 学习基础和c语言基础调查

    做中学读后感 学习是要思考的,仅仅实践是不够的: 不光会动手,还要理解背后的原理 不光会用工具,还要理解支撑的理论 技能是分层次的: 一项技能的掌握程度分为:新手/高级初学者/合格者/精通/专家 对技 ...

  2. Python中字符串的操作

    字符串的基本详情 用单引号或者双引号包含的内容 不支持直接在内存中修改 可支持索引.切片.成员检查.长度查看 字符串赋值到变量 str1 = 'hello world' 字符串打印查看 str1 = ...

  3. 虚拟机部署hadoop集群准备工作之多虚拟机设置网络信息

    安装好了centos6.4(最简版)后   1,静态IP设置 查看虚拟机的网络设置信息来配置

  4. JAVA核心技术I---JAVA基础知识(抽象类和接口)

    一:抽象类 (一)定义 类:属性(0或多个)+方法(0或多个)一个完整(健康)的类:所有的方法都有实现(方法体)类可以没有方法,但是有方法就肯定要有实现,这才是一个完整的类一个完整的类才可以被实例化, ...

  5. UNIX网络编程中的字节序问题

    1.inet_pton 函数原型: inet_pton:将“点分十进制” -> “二进制整数” int inet_pton(int af, const char *src, void *dst) ...

  6. C#多线程和异步(二)——Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  7. Sqlserver中的触发器

    一 什么是触发器 1.1  触发器的概念   触发器(trigger)是SQL server来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行是由事件来触发,当对一个表进行操作(  ...

  8. mq【转】

    kafka解决了什么问题? mq的几个指标 1.消息堆积能力.两亿条1k大小消息体的消息发上来,积压一周不消费,机器哭不哭. 2.吞吐量.来个峰值,每秒两万,连续两小时,临时扩容扛不扛得住. 3.安全 ...

  9. HDU 1027(数字排列 STL)

    题意是求 n 个数在全排列中的第 m 个序列. 直接用 stl 中的 next_permutation(a, a+n) (这个函数是求一段序列的下一个序列的) 代码如下: #include <b ...

  10. 【坑】zsh和oh-my-zsh卸载后导致无法登陆

    apt-get remove zsh 然后断开终端,就再也连不上了,崩溃啊! 以下登陆为www用户登陆 各种找,到这里 https://www.cnblogs.com/EasonJim/p/78630 ...