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

时间: 2017-11-30阅读: 1145标签: 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.阿里云: 本站目前使用的是阿里云主机,安全/可靠/稳定。点击领取2000元代金券、了解最新阿里云产品的各种优惠活动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各类产品的最新活动,优惠券领取点击进入

3.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

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

js词法作用域和作用域的理解_什么是javascript词法作用域?

JavaScript引擎在代码执行前会对其进行编译:第一步编译阶段,第二步运行阶段。词法作用域:定义在词法阶段的作用域,即书写代码时函数声明的位置决定的。词法分析器处理代码时会保持作用域不变

JS中for循环的常见题型

for循环示例;让用户输入行数,使用for循环嵌套打出倒着的星星出来,行数等于用户输入的数字 ;有1,2,3,4这么4个数,能组成多少个互不相同且不含有重复数字的三位数?都是多少?

javascript怎么判断按钮被点击?

JavaScript可以通过Event对象的target事件或srcElement(IE浏览器支持)来判断按钮是否被点击。Event对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

js浮点数精度丢失问题_如何解决js中浮点数计算不精准?

理解javascript中浮点数计算不精准的原因,如何解决浮点数的四则运算(加减乘除)。js中除了toFixed方法以外的实现方法总汇

window.location.href的用法(动态输出跳转)

javascript中的location.href有很多种用法,window.location.href 语句可以实现一个框架的页面在执行服务器端代码后刷新另一个框架的页面

js中offset、scroll、event、client的区别和使用

用一句话概述:offset用于获取元素的实际显示尺寸 , scroll用于获取滚动后全部尺寸 , client用于获取不包括滚动条的实际显示尺寸,event用于获取鼠标的坐标位置。下面就详细介绍它们之间的使用和区别

44道JS难题

国外某网站给出了44道JS难题,这些题涉及面非常广,涵盖JS原型、函数细节、强制转换、闭包等知识,而且都是非常细节的东西,透过这些小细节可以折射出很多高级的JS知识点。

原生js判断当前页面是否为激活状态【判断用户是否在浏览当前页面】

但浏览器打开多个网页时候,如何判断我这个页面是否正在被用户浏览呢?我们可以通过document.hidden属性判断当前页面是否是激活状态。

JavaScript支持宏吗?

与其它类 Lisp 语言不同,不支持宏是 JavaScript 与生俱来的一个问题,这是因为宏会在编译时操作语法树,而这在像 JavaScript 这样的语言中几乎是不可能的。

js中void 0 与 undefined

偶然看到一个问题:为什么有的编程规范要求用 void 0 代替 undefined?如果不知道这个答案的小伙伴,第一反应就要问void 0是什么鬼?

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

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广