JS的变量作用域问题,理解js全局变量和局部变量问题

时间: 2017-11-30阅读: 1828标签: js知识

js的变量分为2种类型:局部变量和全局变量。主要区别在于:局部变量是指只能在变量被声明的函数内部调用,全局变量在整个代码运行过程中都可以调用。值得注意的js中还可以隐式声明变量,而隐式声明的变量千万不能当做全局变量来使用。下面将通过一些例子做详细说明:


例子一:

var a="Hello";  
 function test(){  
    var a;  
    console.log(a);  //输出undefined
    a = "World";  
    console.log(a);  //输出World
    console.log(this.a);//输出Hello
    console.log(this === window);//true
} 
test();
console.log(a);//输出Hello

从上面代码可以看出:当局部变量跟全局变量重名时,局部变量在函数内部有声明,同时在函数内部输出时会覆盖掉全局变量,当使用this调用的时候,this默认指向的是window,所以输出的是全局变量的值。

  

例子二:

var a = "Hello";
function test(){
    console.log(a);//undefined
    var a = "world";
    console.log(a);//World
}
test();

这里并没有输出“Hello”,我们在第一已经定义了全局变量a,这是由于:js在执行test()方法时声明部分已经完成了,在执行过程中才进行赋值,所以在这个函数中,执行第3行前,可以认为已经声明了局部变量a,但是并没有定义(这里即赋值),所以第3行输出结果为undefined,执行第4行a 赋值为“world”,所以打印局部变量a的值是world 。


例子三:

var a = "Hello";
function test(){
    console.log(a);//Hello
    a = "World";
    console.log(a);//World
}
test();
console.log(a);//World

这是由于在函数内部,一般用var声明的为局部变量,没用var声明的一般为全局变量,所以没声明的a赋值为“World”,这里的a是全局变量。


例子四:

function test(){
    var a=b=c=d="World";
}
test();
console.log(b+c+d);//而b、c、d都能输出World
console.log(a);//输出时候报错(not defined)

这是由于Js的赋值是从右向左结合: var a=b=c=d="World"; 等价于 var a=(b=(c=(d="World")));,其中只有a被声明了,b,c和d都是自动解析为全局变量了。


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/203

js基础_如何理解作用域和作用域链?

作用域外,无法引用作用域内的变量;离开作用域后,作用域的变量的内存空间会被清除,比如执行完函数或者关闭浏览器,作用域与执行上下文是完全不同的两个概念。我曾经也混淆过他们,但是一定要仔细区分。JavaScript代码的整个执行过程,分为两个阶段,代码编译阶段与代码执行阶段。

理解js中prototype和__proto__和的区别和作用?

在js中有句话叫一切皆对象,而几乎所有对象都具有__proto__属性,可称为隐式原型,除了Object.prototype这个对象的__proto__值为null。Js的prototype属性的解释是:返回对象类型原型的引用。每个对象同样也具有prototype属性,除了Function.prototype.bind方法构成的对象外。

数字在JavaScript中是如何编译的

JavaScript中的所有数字都是浮点数。这篇博客文章解释了这些浮点数如何在64位二进制内部表示。浮点数并不一定等于小数,定点数也并不一定就是整数。所谓浮点数就是小数点在逻辑上是不固定的,而定点数只能表示小数点固定的数值

JS中的词法作用域(静态作用域)和动态作用域

首先说明一下,JavaScript没有用动态作用域概念,但 this 机制却和动态作用域类似!JavaScript是通过作用域链的方式进行变量查找的,而JS作用域链是词法作用域,也就做静态作用域!词法作用域:在函数声明(定义)时确定的

JavaScript中奇特的~运算符

本次分享一下并不是很常用的按位非运算符~的原理以及一点点用法。产生式 UnaryExpression : ~ UnaryExpression 按照下面的过程执行:令 expr 为解释执行 UnaryExpression 的结果。令 oldValue 为 ToInt32(GetValue(expr))。返回 oldValue 按位取反的结果。

js的微任务和宏任务

宏任务:当前调用栈中执行的代码成为宏任务。微任务: 当前(此次事件循环中)宏任务执行完,在下一个宏任务开始之前需要执行的任务,可以理解为回调事件。

你不知道的 js 保留字

先是笼统的说一下有什么保留字,保留字的话根据犀牛书的划分,可有分为以下几类:基础保留字、严格模式下的保留字、严格模式下的不完全保留字、ECMAScript3的保留字、ECMAScipt 5 的保留字、全局变量和函数

javascript怎么输出?

JavaScript怎么输出?输出方式有哪些?下面本篇文章就给大家介绍JavaScript的几种输出方式。window.alert()方法用于显示带有一条指定消息和一个【确认】 按钮的警告框。

JS方法整理_js常用函数大全

都是日常工作中使用的一些js方法,整理出来以便大家学习使用。主要包括:Js获取页面地址参数 、千分位 、判断是否数字 、图片按比例压缩、截取指定字节数的字符串、判断是否微信 、获取时间格式的几个举例 、获取字符串字节长度 、对象克隆、深拷贝 ...

前端与编译原理——用JS写一个JS解释器

说起编译原理,印象往往只停留在本科时那些枯燥的课程和晦涩的概念。作为前端开发者,编译原理似乎离我们很远,对它的理解很可能仅仅局限于“抽象语法树(AST)”。但这仅仅是个开头而已。编译原理的使用,甚至能让我们利用JS直接写一个能运行JS代码的解释器。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!