作为前端小白,总是对JS的作用域有点迷糊,这里稍微研究了一下分享出来,希望和我一样的小白可以学的一点

首先是一个经典的例子:

var a=0,b=0;
for (var i = 0; i < 10; i++) {
a = 2
if (true) {
b = 3;
}}
console.log(a,b); //2 3

 这里肯定输出2,3    但是我们加上var后结果依然会这样:

var a=0,b=0;
for (var i = 0; i < 10; i++) {
var a = 2
if (true) {
var b = 3;
}}
console.log(a,b,i); //输出 2 3 10

  这里就很尴尬了,很多初学者都会犯这种毛病,以为在里面加上var就是局部变量,其实在 for 和 if 中可以不用var关键字,因为ECMAScript不存在块级作用域,因此循环内部的变量可以在外边访问到。

  值得一提的是ES6添加了let这一特性,使得它定义的变量被限定在了特定范围内才能使用,而离开这个范围则无效。

  如下:

 var a=0,b=0,i=0;
for (let i = 0; i < 10; i++) {
let a = 2
if (true) {
let b = 3;
}}
console.log(a,b,i); //0 0 0

  现在我们再来看函数以及参数的作用域:

 var a=0,b=1;
function x(a,b){
arguments[0]=100;
window.b=222;
b=333;
c=99;
console.log(a,b,c); //100 333 99
}
x(a,b);
console.log(a,b,c); //0 222 99

  ECMAScript中所有参数都是按值传递的,也就是说把函数外部的值赋给内部的参数,而且参数只能按值传递,你可以把函数的参数想象成局部变量。

  我们将a,b两个变量传递给函数的参数,然后在第3行改变第一个参数的值,在第4行使用window改变全局变量b的值,显然函数内部参数的改变无法影响到全局变量。

但是在第6行我们赋值时没有使用关键字var,于是函数调用完后,这个变量c 被添加到了全局环境下。

  在编写JS代码中,不声明直接初始化变量很不好,这样有可能导致意外,所以建议在初始化前一定要先声明。

JS的作用域浅谈的更多相关文章

  1. Node.js:Buffer浅谈

    Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...

  2. Node.JS + MongoDB技术浅谈

    看到一个Node.JS + MongoDB的小样例,分享给大家.魔乐科技软件学院(www.mldnjava.cn)的讲座 Node.JS + MongoDB技术讲座          云计算 +大数据 ...

  3. 从JS和jQuery浅谈DOM操作,当我们在获取时,究竟获取了什么

    0.写在前面的话 自己对前端的东西一直不是很熟,现在开始要想办法从前端各个地方去获取想要的属性值的时候,也基本是在网上现炒现卖,几周下来,发现自己还是迷迷糊糊,可以算是一无所获. 所以就抽时间,把这一 ...

  4. [JS学习笔记]浅谈Javascript事件模型

    DOM0级事件模型 element.on[type] = function(){} 兼容性:全部支持   lay1 lay2 lay3 e.target:直接触发事件的元素[IE8及以下不支持tage ...

  5. 浅谈DFS,BFS,IDFS,A*等算法

    搜索是编程的基础,是必须掌握的技能.--王主任 搜索分为盲目搜索和启发搜索 下面列举OI常用的盲目搜索: 1.dijkstra 2.SPFA 3.bfs 4.dfs 5.双向bfs 6.迭代加深搜索( ...

  6. 浅谈 js eval作用域

    原文:浅谈 js eval作用域 就简单聊下如何全局 eval 一个代码. var x = 1; (function () { eval('var x = 123;'); })(); console. ...

  7. 浅谈js变量作用域

    变量的作用域也是前端面试题常考的一个问题,掌握下面几个规律可以帮你更好的理解js的作用域. 1.作用域优先级遵循就近原则,函数内部的作用域优先级大于外部 var a=456; var b=111; f ...

  8. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  9. 浅谈 js 语句块与标签

    原文:浅谈 js 语句块与标签 语句块是什么?其实就是用 {} 包裹的一些js代码而已,当然语句块不能独立作用域.可以详细参见这里<MDN block> 也许很多人第一印象 {} 不是对象 ...

随机推荐

  1. dev控件chart简单实现多图例,双曲线,双柱图,曲线与柱图

    1.效果图 2.数据源代码: ; i < ; i++) { == ) { dt1.Rows.Add( * i); dt2.Rows.Add( * i+); } else { dt1.Rows.A ...

  2. Mr.聂 带你成为web开发大牛——入门篇(上)

    作为一名IT届的后生,当初也经历过懵懂无知的实习期,对那种无力感深有体会.在这,希望能用我这几年的开发经验,让各位即将踏入或者刚刚踏入web开发领域的新人们少走些弯路.鉴于这是入门篇,下面我就从零为大 ...

  3. 脚本之家 前端jQuery js 学习 网站

    http://www.jb51.net/books/ http:// www.3wschool.com/

  4. Jsp,Servlet初学总结

    一.Jsp 1. 指令: <%@page language="java" import="java.*" contextType="text/h ...

  5. MacOS无法登录App Store修复

    MacOS无法登录App Store修复 2017-03-10 21:13:39  by:SemiconductorKING 先上图: 惨红色的提示信息,把你拒之App Store门外,但是对之放弃. ...

  6. Linux下随机生成密码的命令总结

    有时候经常为如何设置一个安全.符合密码复杂度的密码而绞尽脑汁,说实话,这实在是一个体力活而且浪费时间,更重要的是设置密码的时候经常纠结.终于有一天实在忍不住了,于是学习.整理了一下如何使用Linux下 ...

  7. 每天一个Linux命令 3

    Linux grep命令详解: grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一 ...

  8. 1131: [POI2008]Sta

    1131: [POI2008]Sta Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 783  Solved: 235[Submit][Status] ...

  9. 通过git提交代码到仓库

    昨天有一个妹子问我如何在还没有commit之前push本地的代码到仓库,现在写写,希望能够帮到大家. 当我们pull的时候会出现没有代码commit的错误提示,在这种情况下,我们需要再commit之前 ...

  10. Kali linux learning note

    from:http://blog.sina.com.cn/s/blog_40983e5e0101dhz0.html     因为kali linux基于debian 7,当然要把这台Acer 4736 ...