(function(){
a = 5;
alert(window.a);
var a = 10;
alert(a);
})();

结果: undefined 10


代码等同于下面

var a = undefined;   //定义全局变量
(function(){
var a; //
a = 5; // a = 5;但是被局部变量覆盖,这时候的a是局部变量
alert(window.a); //a = undefined; 试图访问全局变量a,可是并没有赋值
a = 10; //依然是局部变量a
alert(a); //a = 10
})();

分析:

1.在产生一个作用域的时候,会预编译一次里面的变量,其中的动作是将所有的变量名,函数名,提前定义,然后在赋予当前的变量的所在作用域,运行。

2.变量名的定义会覆盖函数名,可是函数名(见下面)

var a;
function a(){
alert(12);
}
a(); //alert(12)
a = 10;
a(); //Uncaught TypeError: a is not a function

a的定义,function的定义 换个顺序

	(function(){
var a=10;
function a(){
alert(2);
return 8;
}
alert(a);
alert(a());//Uncaught TypeError: a is not a function
})();
//分析:a() 的函数名并不会覆盖变量名 function a(){
alert(2);
return 8;
}
(function(){
var a=10;
alert(a); // 10
alert(a());//结果:Uncaught TypeError: a is not a function;如果把函数名称换成c,那么js会往上级查找,如果在本作用域中找到a,那么直接调用,这时的调用会忽略a的类型(若类型的语言?)
alert(window.a());// 2, 8
})();
  • 在建立以一个作用域时,编译时,变量的声明会提前,在确定作用域,运行。
  • js中的变量名不会被同名的函数覆盖,而同名的函数会被变量覆盖。
  • 在js中调用函数,如果有同名的变量,那么会直接调用这个变量,不会向上查找,如果没有这个变量,才会向上查找

js的变量作用域 ,变量提升的更多相关文章

  1. js:函数与变量作用域的提升

    一.要彻底理解JS的作用域和Hoisting,只要记住以下三点即可:      1.所有申明都会被提升到作用域的最顶上      2.同一个变量申明只进行一次,并且因此其他申明都会被忽略      3 ...

  2. js变量作用域--变量提升

    1.JS作用域 在ES5中,js只有两种形式的作用域:全局作用域和函数作用域,在ES6中,新增了一个块级作用域(最近的大括号涵盖的范围),但是仅限于let方式申明的变量. 2.变量声明 var x; ...

  3. JavaScript 变量作用域

    一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...

  4. php部分(查看文件、建立站点、语法变量、变量的几个方法、“全局局部变量的调用”、static、函数参数的作用域);

    浏览器查看php文件: 建立站点,浏览php文件: php的语法 <?php echo "Hello World!"; ?> 注释语法: <?php // 这是 ...

  5. python学习之【第九篇】:Python中的变量作用域

    1.前言 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的. 2.变量作用域 变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python的作 ...

  6. Python基础:11变量作用域和闭包

    一:变量作用域 变量可以是局部域或者全局域.定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域. 全局变量的一个特征是除非被删除掉,否则它们的存活到脚本运行结束,且对于所有的函数, ...

  7. Python-变量、变量作用域、垃圾回收机制原理-global nonlocal

    变量实现原理决定了Python使用的垃圾回收机制为变量引用计数,当这个对象引用计数为0时候,则会自动执行__del__函数回收资源, del方法只是把变量指向的对象引用计数减一而已并删除这个变量 表达 ...

  8. 深入理解JS中的变量及变量作用域

    JS的变量有两种,“全局变量”和“局部变量”. “全局变量”声明在函数外部,可供所有函数使用,(全局变量属于window)而“局部变量”声明在函数体内部,只能在定义该变量的函数体内使用. 1.全局变量 ...

  9. js 变量、函数提升 与js的预编译有关

    参考网址:http://www.codesec.net/view/178491.html 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = ...

  10. js 变量、函数提升

    js 变量.函数提升 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = 1; if (x) { var x = 2; } console.l ...

随机推荐

  1. 在ubuntu下安装phpmyadmin 出现404错误

    在ubuntu下安转phpmyadmin 只要一条命令: Sudo apt-get install phpmyadmin 安装完成后,在浏览器里输入http://localhost/phpmyadmi ...

  2. Bootstrap配套的js框架

    求几个搭配bootstrap的js框架.实现如表单验证,文件多传下载等等 Bootstrap File Input文件选择控件: PNotify通知插件: ClockPicker时间拾取器: Boot ...

  3. Selenium 疑问之二:如何使页面滚动条移动到指定元素element的位置处?

    在用selenium做测试时,会遇到需要操作的元素不在当前可视页面中的情况,如果是手工测试,自然很简单,手动拖拽滚动条到目标元素处即可. 那么,selenium如何实现这种情形呢?答案是需要借助Jav ...

  4. 部署windows服务

    (1) cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319(2) InstallUtil.exe D:\SVN\zhongchao\开发\WeiXin ...

  5. HDU 4786 Fibonacci Tree

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) P ...

  6. 关于mediacontroller的一些好的文章

    1. Vitamio中文API文档(3)—— MediaController http://www.cnblogs.com/over140/archive/2012/08/30/2663733.htm ...

  7. Laxcus大数据管理系统2.0(8)- 第六章 网络通信

    第六章 网络通信 Laxcus大数据管理系统网络建立在TCP/IP网络之上,从2.0版本开始,同时支持IPv4和IPv6两种网络地址.网络通信是Laxcus体系里最基础和重要的一环,为了能够利用有限的 ...

  8. 慕课网-安卓工程师初养成-1-6 MyEclipse的使用简介

    来源 http://www.imooc.com/video/1414 http://www.my-eclipse.cn/ MyEclipse 2014 官方版下载地址  声明:MyEclipse 20 ...

  9. memcached学习(二)

    Slab Allocation机制:整理内存以便重复使用 最近的memcached默认情况下采用了名为Slab Allocator的机制分配.管理内存. 在该机制出现以前,内存的分配是通过对所有记录简 ...

  10. 解决visual studio已安装的问题

    使用Windows Install Clean Up(用管理员身份打开),找到相应的软件