用var变量是有作用域的

变量在函数内部声明时,那么该变量只属于整个函数体,函数外不可调用

当两个不同的函数里,使用了用一个相同的变量名,二者不互相影响,相互独立

遇到嵌套函数时,外部函数不可调用内部函数的变量,而内部函数可调用外部函数变量

当遇到同一变量时,也是同理,“就近原则”

变量提升

JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部

function test(){

var x = 'test, ' + y;

console.log(x);

var y = '2';

}

foo();

返回:

//test, undefined

打印并不会出错,这是因为此时,变量 y 已经被声明,当未被赋值

在引擎里面看到的代码

function test(){

var x;

var y;

x = 'test, ' + y;

console.log(x);

y = '2';

}

基于Javascript特性,我们在函数定义变量时,应该遵守,首先声明所有变量的规则

最常见的做法是用一个var申明函数内部用到的所有变量

function test(){

var x = 1, y = 2, z;

...

}

全局作用域

不在任何函数内定义的变量就具有全局作用域,全局作用域的变量会被绑到window的一个属性上

var course = 'Learn Js';

console.log(course); // 'Learn Js'

console.log(window.course); // 'Learn Js'

我们以前用变量定义函数,同样的,其也会成为全局变量

提升ReferenceError错误,是因为没有该变量

命名空间

为了避免使用了相同全局变量,造成命名冲突

我们把所有的变量和函数全部绑定到一个全局变量(对象)里

//唯一全局变量 myApp

var myApp = {};

//其他变量

myApp.name = 'Job';

myApp.edition = 1.0;

myApp.test = function(){

...

}

局部作用域

变量作用域在函数内部,但for等语句块无法定义其局部的作用域,所有可以被当前函数所调用

function test() {

for (var i = 0; i < 2; i++){

...

}

console.log(i); // 2

}

为了解决类似这样的问题,ES6标准引入了关键字let,功能和var一样,但let可以声明一个块级作用域变量

function test() {

for (let i = 0; i < 2; i++){

...

}

console.log(i); // ReferenceError 该作用域没有此变量

}

常量

在ES6标准之前,无法没有此功能,通常用变量整体大写来表示常量

var EDITION = 1.0;

ES6标准则引入关键字,const来定义常量,const与let一样具有块级作用

const edition = 1.0;

edition; // 1.0

解构赋值

ES6标准引入了解构赋值,可以同时对一组变量进行赋值

什么是解构赋值?

var array = ['Job', 'Steven', 'Ben'];

var x = array[0];

var y = array[1];

var z = array[2];

ES6演示

var [x, y, z] = ['Job', 'Steven', 'Ben'];

console.log('x = ' + x + ', y = ' + y + ', z = ' + z)

// x = Job, y = Steven, z = Ben

也可以选择解构赋值某一个值

var [, , z] = ['Job', 'Steven', 'Ben'];

z; // Ben

同样也可以获取对象属性

var person = {

name: 'Job',

age: 18,

school: 'No.1 school',

email: 'xxx.@xx.com'

};

var {name, age, email} = person;

console.log('name = ' + name + ', age = ' + age + ', email = ' + email);

// name = Job, age = 18, email = xxx.@xx.com

对嵌套的对象属性进行赋值时, 只要保证对应的层次是一致的

var person = {

name: 'Job',

age: 18,

school: 'No.1 school',

email: 'xxx.@xx.com'

address: {

city: 'Earch',

mail: 10001

}

};

var {name, address: {city, street}} = person;

name; // Job

city; // Earch

street; // undefined

解决解析赋值对应不存在问题

var {name, city: test} = person;

name; // Job

test; // Earch

这里的city并非变量,仅仅是把值赋给test

city; // ReferenceError

解构赋值也可以使用默认值

var {name, single = true} = person;

当变量被声明后,解析赋值所被赋值的变量则无效

// 声明变量

var x, y;

// 解构赋值

{x, y} = { name: '小明', x: 100, y: 200};

// 语法错误: SyntaxError

这是因为JavaScript引擎把{开头的语句当作了块处理,于是=不再合法。解决方法是用小括号括起来

({x, y} = { name: '小明', x: 100, y: 200});

这里暂时看不懂

使用场景

交换两个临时变量

var x=1, y=2;

[x, y] = [y, x]

快速获取当前页面域名和路径

var {hostname:main, pathname:path} = location;

JS变量作用域与解构赋值的更多相关文章

  1. JavaScript学习笔记(八)——变量的作用域与解构赋值

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  2. ES6 (一)变量声明方法 & 解构赋值

    就是最新的JavaScript 原来的是var,要求不严格,不能限制修改,函数级 es6要求严格 1.防止重复声明 let      变量=var const 常量 2.控制修改 const常量不能修 ...

  3. 001-es6变量声明、解构赋值、解构赋值主要用途

    一.基本语法 1.1.声明变量的六种方法 参看地址:http://es6.ruanyifeng.com/#docs/let let:局部变量,块级作用域,声明前使用报错 var:全局变量,声明前使用 ...

  4. ES6知识整理(2)--变量的解构赋值

    最近准备在业余空闲时间里一边学习ES6,一边整理相关知识.只有整理过的学习才是有效的学习.也就是学习之后要使用和整理成文,才是真正的学到了... 上一篇是一个试水,现在接上. 变量提升 看了下朋友回复 ...

  5. ES6学习随笔--字符串模板、解构赋值、对象、循环、函数、Promise、Generrator

    在线编译器:babel.github 在nongjs中使用 'use strict' let a = ; 运行node : node --harmony_destructuring xxx.js 代码 ...

  6. ES6笔记(3)-- 解构赋值

    系列文章 -- ES6笔记系列 解构赋值,即对某种结构进行解析,然后将解析出来的值赋值给相关的变量,常见的有数组.对象.字符串的解构赋值等 一.数组的解构赋值 function ids() { ret ...

  7. ES6解构赋值

    前面的话 我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段.在ES6中添加了可以简化这种任务的新特性:解构.解构是一种打破数据结构,将其拆分为更小部分的过程.本文将详细介绍ES6解构赋值 ...

  8. ES6 - Note2:解构赋值

    ES6的解构赋值就是利用模式匹配从按照一定模式的数组或者对象中提取值赋值给变量. 1.数组的解构赋值 在ES6以前,变量的赋值是直接指定的,以后可以这么来写,如下所示 let [a,b,c] = [1 ...

  9. ES6-个人学习笔记二--解构赋值

    第二期,解构赋值如果能够熟练应用确实是个十分方便的功能,但是过分的依赖和嵌套只会让代码理解和维护起来十分困难,是个体现高逼格的表达式呢~ 1,解构赋值的基础 //定义:es6运行按照一定模式,从数组或 ...

随机推荐

  1. 云计算openstack共享组件——Memcache 缓存系统(4)

    一.缓存系统 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告 ...

  2. Vue开发电子书app

    ebook-app 在根目录下创建vue.config.js文件 module.export = { baseUrl: process.env.NODE_ENV === 'production' ? ...

  3. hystrix源码之插件

    HystrixPlugins 获取并发相关类(HystrixConcurrencyStrategy).事件通知类(HystrixEventNotifier).度量信息类(HystrixMetricsP ...

  4. TP 3.2 图片处理类

    TP 3.2 图片处理类 <?php namespace Common\Common; class ImageEdit{ /** * [上传图片并生成缩略图] * @param [type] $ ...

  5. py004.python的逻辑运算,随机数及判断语句if,elif,else

    判断语句又称 "分支语句" if判断语句的格式: if 条件1: 条件1满足时,执行的代码 -- # 前面有缩进4个空格 elif 条件2: 条件2满足时,执行的代码 -- # 前 ...

  6. 随机梯度下降法(Stochastic gradient descent, SGD)

    BGD(Batch gradient descent)批量梯度下降法:每次迭代使用所有的样本(样本量小)    Mold 一直在更新 SGD(Stochastic gradientdescent)随机 ...

  7. Linux系统编程—信号集操作函数

    先来回顾一下未决信号集是怎么回事. 信号从产生到抵达目的地,叫作信号递达.而信号从产生到递达的中间状态,叫作信号的未决状态.产生未决状态的原因有可能是信号受到阻塞了,也就是信号屏蔽字(或称阻塞信号集, ...

  8. 【题解】NOIP2018 填数游戏

    题目戳我 \(\text{Solution:}\) 题目标签是\(dp,\)但是纯暴力打表找规律可以有\(65\)分. 首先是对于\(O(2^{nm}*nm)\)的暴力搜索,显然都会. 考虑几条性质: ...

  9. Hadoop理论基础

    Hadoop是 Apache 旗下的一个用 java 语言实现开源软件框架,是一个开发和运行处理大规模数据的软件平台.允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理.   特性:扩 ...

  10. Redis哨兵知识点总结

    1.Redis哨兵介绍 sentinal,中文名是哨兵 A.哨兵是redis集群架构中非常重要的一个组件,主要功能如下 集群监控,负责监控redis master和slave进程是否正常工作 消息通知 ...