JS中最经典的全局变量和局部变量问题

话不多说,直接上例子:

1、程序的运行结果为:100  10  100

1 var a = 10;
2 function test(){
3     a = 100;
4     console.log(a);
5     console.log(this.a);
6     var a;
7     console.log(a);
8 }
9 test();

解析:Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定变量的作用域,所以在函数test执行前,由于第6行声明了局部变量a,所以函数内部的a都指向已经声明的局部变量,所以第4行输出100。第5行输出this.a,我们都知道,函数内部的this指针指向的是函数的调用者,在这里函数test被全局对象调用,所以this指针指向全局对象(这里即window),所以this.a = window.a,一开始生命了全局变量a=10,所以第5行输出结果为10。第7行输出结果为100,因为局部变量a在第3行已经被赋值了100,所以直接输出局部变量a的值。

2、程序的运行结果为:undefined  10

1 var a = 100;
2 function test(){
3     console.log(a);
4     var a = 10;
5     console.log(a);
6 }
7 test();

解析:看了第1个例子,可能有同学会认为输出结果是10  10,但是结果却不是10 10,为什么呢?仔细看第1个例子解析的第一句话,Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),但是不能对变量定义做提前解析,在这个函数中,执行第3行前,可以认为已经声明了变量a,但是并没有定义(这里即赋值),所以第3行输出结果为undefined,执行第4行a =10后,变量a的值就为10,所以第5行输出结果为10。

3、程序的运行结果为:100  10  10

1 var a = 100;
2 function test(){
3     console.log(a);
4     a = 10;
5     console.log(a);
6 }
7 test();
8 console.log(a);

解析:我们知道在函数内部,一般用var声明的为局部变量,没用var声明的一般为全局变量,在test函数内,a=10声明了一个全局变量,所以第3行的a应该输出全局变量的值,而在函数执行之前已经声明过一个全局变量并赋值100,所以这里第上输出100。第4行给全局变量a 重新赋值10,所以全局变量a的值变成10,所以第5行输出10。而在函数test外部,第8行输出全局变量a的值,因为全局变量被重新赋值为10,所以输出结果即为10。

如有错误的地方欢迎批评指正

时间: 2024-11-05 13:47:23

JS中最经典的全局变量和局部变量问题的相关文章

C/C++中static的用法全局变量与局部变量

1.什么是static? static 是C/C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 1.1static的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义为全局的变量,但定义一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制).s

如何判断函数中的变量是全局变量还是局部变量

1如果在函数中,变量前加了global,很显然该变量是全局变量 2如果函数中的一个变量和全局变量的名称相同,但是函数没有给这个变量赋值,那么这个变量是全局变量 3如果函数中的一个变量和全局变量的名称相同,但是函数给该变量赋值了,这个变量就是局部变量 4如果函数中的变量没有与之同名的全局变量,那么该变量显然是一个局部变量 (看起来有点傻,主要注意第二条和第三条,尽量函数中不用全局变量,因为不好调试)

js中的经典案例--简易万年历

html代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie

js的预编译、全局变量、局部变量相关知识

1.未声明的变量就赋值, 此变量归全局变量window对象所有 console.log(a); //a is not defined a=10 console.log(a); //10 等价于 console.log(window.a) function test(){ var a = b = 123; } test(); console.log(b) //123 b未声明就赋值归为window对象所有, 等价于console.log(window.b); console.log(a) //a

js中全局变量的一点小知识点

js中有三种方式定义全局变量: 在任何函数外面直接执行var语句,例如:var f="value"; 直接添加一个属性到全局变量上,在web浏览器中,全局对象名为window.例如:window.f="value"; 直接使用未经过声明的变量,以这种方式定义的全局变量成为隐式的全局变量.例如:f="value"; 尽可能少使用全局变量: 其中一种方法就是将他们添加到同一个命名空间去:例如: 1 var My={}; 2 My.name={ 3 &

针对JS经典题型对全局变量及局部变量的理解浅谈

第一次写博,还蛮激动... 看到了三题经典题型,经老师讲解后,对此类题目有了更深刻的认识 就我目前的认识对此题进行总结.如有错误,敬请指正 首先,我们先明确一下JS引擎的工作步骤: js引擎工作分为两步: 1.将这个js中的变量和函数声明保存到当前(注意,是当前)执行环境的变量对象中 2.再逐行解析执行js.当看到一个函数或一个变量时,js引擎就会去查询 这个函数或变量是在哪里定义的 查询的方式有两种: a.按作用域链查找:先在当前执行环境查询这个变量或程序,如果没有,就到父执行环境 中查找,还

关于js中全局变量和局部变量的寄到小题

往往最基本的也是最根本的. 这里有三道关于全局变量和局部变量的小题,供诸位一阅. 知识点: (1)在最外层声明的是全局变量 (2)在函数内声明的是局部变量 (3)在函数体内部,但是没有用var声明的变量也是全局变量 第一题: var a = 10;function fun(){var a = "global";}console.log(a); 第二题: var a ;function fun(){a = "global";} fun();console.log(a)

解析js中作用域、闭包——从一道经典的面试题开始

如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎么写,是不是这样? 可是结果呢,弹出来的都是10,为啥? var i,a for(i=0;i<10;i++){ a=document.createElement('a') a.innerHTML=i+'<br>' a.addEventListener('click',function(eve

JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用

“JavaScript设计得最出色的就是它的函数的实现.” -- <JavaScript语言精粹> 函数包含一组语句,它们是JS的基础模块单元,用于指定对象的行为.一般来说,所谓编程,就是将一组需求分解成一组函数与数据结构的技能. 1.函数的功能 代码重复性使用 模块化编程 2.语法: 使用函数前要先定义才能使用 函数定义有三个部分:函数名,参数列表,函数体 格式: 1 function 函数名([参数1, 参数2, ...]){ 2 3 函数执行部分; 4 5 return 表达式; 6 7