// 测试1

console.log('----------test1--------------');

console.log(global); // undefined

var global = 'hahaha';

console.log(global); // hahaha

function fn(){

console.log(a); // undefined

var a = 'aaa';

console.log(a); // aaa

}

// 如果一个变量没有定义的话就去输出,就会报出错误

//console.log(a); // error : undefined

fn();

// 代码执行思路解析

/*var global; // 变量提升,全局作用域范围内,此时只是声明,并没有赋值

console.log(global); // undefined

global = 'hahaha'; // 此时给变量赋值

console.log(global); // 输出已经赋值过的global变量

function fn(){

var a; // 变量提升为函数作用域范围内

console.log(a);

a = 'aaa';

console.log(a);

}

fn();*/

// 测试2 : 函数提升

console.log("------------------函数提升测试-----------------");

console.log(f1); // [Function: f1]

console.log(f2); // undefined

function f1(){ // 这块代码会自动函数提升,整个代码块提升到文件的最开始部分

}

var f2 = function(){

}

console.log(f2);

// 测试3

console.log("------------test3---------------");

// 第一步会先去执行f1()函数,执行完毕这个函数之后开始打印输出这个函数的返回值

console.log(f1()); // undefined 123456hahaha

function f1(){

console.log('aaa'); // aaa

return '123456hahaha';

}

console.log(f4); // var f4 undefined

var f4 = function(){

console.log('f4 executed!');

return 'f4 hahaha!';

}

console.log(f4, typeof f4); // 这里得到的实际上是一个函数

// 测试4

console.log('-------------test4------------');

console.log(aaa); // undefined

aaa = '987654321'; // 987654321

console.log(aaa);

var aaa = '123456789';

console.log(aaa); // 123456789

var aaa = '789';

console.log(aaa); // 789

// 测试5

console.log('--------------test5----------------');

var a = '12346789';

(function(){

// 这里的a默认是回去寻找全局作用域里面的a变量

console.log(a); /// error : a is not defined

a = '113579';

var b = 'bbb';

console.log(a);

})();

// 测试6

// 在方法外边不加上一个var是不能来定义变量的

//01. 都加var,在方法内则是局部变量,在方法外则是全局变量。

//02. 在方法内,加var为局部变量,不加var则是全局变量(在执行当前方法之后)

//console.log(bianliang); // error : is not defined

console.log('-----------------test6-----------------');

function test(){

//console.log(shuchubianliang); // error : is not defined

}

test();

var aaaa = 'I\'m a in all'

function test1 () {

// 相当于是var a, 然后输出a的值,当然是undefined

console.log(aaaa)

//console.log(window.a)

var a = 'I\'m a in test1'

console.log(a)

}

test1()

// JavaScript会把作用域里的所有变量和函数提到函数的顶部声明

// JavaScript会使用undefined缺省值创建变量a

console.log(aaaaaaa); // error

var aaaaaaa = '11';

console.log('------------test7-------------');

//思考题: 请问下面的结果是什么? 为什么? 写下你的答案

show();

var a = true;

if( a ){

function show(){

console.log( 1 );

}

}else {

function show(){

console.log( 2 );

}

}

//函数声明, 形如:

function show(){

console.log( '函数声明方式' );

} // 会被提升为全局

//函数表达式, 形如:

var show = function(){

console.log( '表达式方式' );

} // 不会被提升为全局的

【JavaScript高级进阶】JavaScript变量/函数提升的细节总结的更多相关文章

  1. JavaScript高级程序设计学习笔记--函数表达式

    关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码之间会读取函数声明,意思是在执行代码之前会先读取函数声明.这就意味着可以把函数声明放在调用它的语句 后面. sayHi(); funct ...

  2. 《JavaScript高级程序设计》 -- 变量、作用域和内存问题(二)

    1.基本类型与引用类型 基本类型:值保存在变量中 (Number.String.Boolean.Undefined.Null).在内存中占据固定大小空间,被保存在栈内存中 引用类型:值是保存在内存中的 ...

  3. javascript高级程序设计读书笔记----函数表达式

    定义函数两种方式: 1.函数声明 function sayHi(){ alert("Hi"); } sayHi();//调用函数 2.函数表达式 var sayHi = funct ...

  4. 读javascript高级程序设计16-几条函数小技巧

    内容概要 作用域安全的构造函数 惰性载入函数 函数绑定 函数节流 一.作用域安全的构造函数 我们知道,当使用new操作符调用构造函数时,构造函数内部的this会指向新创建对象的实例. function ...

  5. javascript高级知识分析——定义函数

    代码信息来自于http://ejohn.org/apps/learn/. 可以使用哪些方式来声明函数? function isNimble(){ return true; } var canFly = ...

  6. JavaScript高级程序设计-(3) 变量、作用域和内存问题

    传递参数 ECMAScript所有函数参数都是按值传递的,即使对象在函数内部修改了参数的值,原始的引用任然不变,局部对象在函数执行完毕后被销毁

  7. Javascript高级程序设计——javascript简介

    1.Javascript简史 javascript诞生于1995年,是由网景公司的Brendan Eich开发的,最初的目的是在客户端处理一些输入验证操作,自此后成为常见浏览器的特色功能,如今用途已经 ...

  8. Javascript高级程序设计——Javascript简史+使用Javascript

    一.Javascipt简史 1.了解Javascript历史 Netscape(Javascript1.0).Microsoft(JScript)到JS1.1,再到ECMA-262标准 2.知道ECM ...

  9. 浅谈JavaScript变量声明提升

    前段时间阿里实习生内推,一面就被刷了,也是郁闷.今天系统给发通知,大致意思就是内推环节不足以了解彼此,还可以参加笔试,于是赶紧再投一次.官网流程显示笔试时间3月31日,时间快到了,开始刷题.网上搜了一 ...

随机推荐

  1. 我要抓狂了。。又回到了几天不能A一道题的时候

    poj1556我不做了.你做做把...我已经要game over了

  2. 读取到配置文件的C语言的接口实现

    /*********************************************************************  * Author  : Samson  * Date   ...

  3. luogu1991 无线通讯网

    题目大意 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络:每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话.任意两个配备了一条卫星电话线路的哨所(两边都ᤕ有 ...

  4. Android中Calendar类的用法总结

    Calendar是Android开发中需要获取时间时必不可少的一个工具类,通过这个类可以获得的时间信息还是很丰富的,下面做一个总结,以后使用的时候就不用总是去翻书或者查资料了. 在获取时间之前要先获得 ...

  5. 深度学习必备:随机梯度下降(SGD)优化算法及可视化

    补充在前:实际上在我使用LSTM为流量基线建模时候,发现有效的激活函数是elu.relu.linear.prelu.leaky_relu.softplus,对应的梯度算法是adam.mom.rmspr ...

  6. 杂项-人物:Alan cooper

    ylbtech-杂项-人物:Alan cooper Alan Cooper ,“VB之父”“交互设计之父”,荣获视窗先锋奖(Microsoft Windows Pioneer)和软件梦幻奖(Softw ...

  7. 七牛php上传下载类,集成官方文档的方法

    <?phpuse Qiniu\Auth;use Qiniu\Storage\UploadManager;class qiniu{ public $_accesskey = null; publi ...

  8. php 提交编辑数据没有变,返回0,判断

    php 提交编辑数据没有变,返回0,判断以TP为例子 $edit = D('Brand')->save($data);if($edit == true){ echo "修改成功&quo ...

  9. linux ssh文件输

    在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件scp username@servername:/path/filename /var/www/local_dir(本地 ...

  10. C99C新增内容

    继上一篇复合文字之后,今天我们继续谈一谈C99C的新特性. C99标准是继C89标准之后的第二个C语言官方标准,于1999年12月1日正式发布,其中对数据类型(增加了对_Bool),关键字(增加了in ...