作为前端小白,总是对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. 读书笔记 effective c++ Item 17 使用单独语句将new出来的对象放入智能指针

    1. 可能会出现资源泄漏的一种用法 假设我们有一个获取进程优先权的函数,还有一个在动态分类的Widget对象上根据进程优先权进行一些操作的函数: int priority(); void proces ...

  2. js设计模式--工厂模式

    工厂模式: 工厂模式的目的是为了创建对象,它经常是在类和类的方法中实现.简单的工厂模式是由一个方法来决定到底要创建哪类的实例,这些实例经常拥有相同的接口,这种模式在所实例化的类型在编译期并不确定,而是 ...

  3. ionic接入广告

    一.获取Admob phonegap 广告插件(cordova 广告平台插件) 在cordova 和phonegap等html5手机应用里面展示Admob,百度移动联盟,广点通广告需要Cordova ...

  4. 详解JavaScript闭包

    要想完全明白JavaScript的闭包,要先明白js中的一些基础原理,然后我再给出一些例子来讲解闭包. 在执行JavaScript时会创建一个执行环境(excution context),执行环境定义 ...

  5. 【转】Jqgrid学习之ColModel API

    ColModel 是jqGrid里最重要的一个属性,设置表格列的属性. 属性 数据类型 备注 默认值 align string left, center, right. left classes st ...

  6. 了解 : prevent default

    基本了解是阻止事件之前设置好的事件触发,像是angular router ui里的 preventDefault是这样的. 在$stateChange的是后,可以调用preventDefault 来阻 ...

  7. C#一定比C++性能差?当然不!破除迷信,从我做起!

    几乎所有的程序员在初学编程之时,都被灌输过"托管语言(Java.C#)性能比非托管语言(C.C++)差好多" 的迷信教条.如果你问他们为什么,他们一定会说:托管语言需要通过虚拟机或 ...

  8. 数字化工厂ERP解决方案

    数字化工厂 数字化工厂建设,在现有基础上提升,实现管理层对订单进度.生产绩效.产能分析.质量管理.产品追溯和存货管理等提供业务分析报告:在控制层有可视化看板.移动客户端实现对生产状态的实时掌控,快速处 ...

  9. Eclipse插件的各种安装方法

    这篇文章我们总结下安装Eclipse的各种方法,首先一下的步骤都是在版本为“Kepler Service Release 1”的Eclipse下完成的.如果你的Eclipse版本不是"Kep ...

  10. 瞎谈CNN:通过优化求解输入图像

    本文同步自我的知乎专栏: From Beijing with Love 机器学习和优化问题 很多机器学习方法可以归结为优化问题,对于一个参数模型,比如神经网络,用来表示的话,训练模型其实就是下面的参数 ...