Javascript我学之四作用域
本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘
作用域
JavaScript的变量作用域只有两种,全局作用域和函数作用域。
函数的作用域
函数中定义的变量是私有的,仅在本函数范围内有效,称为“函数作用域”。
//每个函数,都定义了一个作用域
function add(num1, num2) {
var sum = num1 + num2;
return sum;
}
console.info(add(, )); //
console.info(sum); //出错!
块作用域与同名变量
JavaScript是没块作用域的
function doSomething(doIt) {
var color = "blue";
if (doIt) {
var color = "red";
console.info("在条件语句中的Color=" + color);
}
console.info("在条件语句外的Color=" + color);
};
doSomething(false); //在条件语句外的Color=blue
doSomething(true); //在条件语句中的Color=red,在条件语句外的Color=red
在if()语句块中定义的color变量,与外部定义的color同名,所以是同一个变量,这是因为javascript并没有块作用域。这与java,c#是不一样的。
变量提升(Hoist)
编译器把函数中后部定义的变量统一移到函数开头进行定义
//hoist: 变量提升
var v = "hello";
(function () {
//输出undefined
console.info(v);
var v = "world";
})();
等价于
var v = "hello";
(function () {
var v;
console.info(v);
v = "world";
})();
所以在函数中定义变量时,要在函数开头集中定义变量,不要在“中途”“临时想起来”地定义变量。
嵌套函数可访问的变量
嵌套的函数,内部函数可以访问外部函数定义的变量,也能访问全局变量
//嵌套函数的变量访问
var world = "world ";
function sayHello() {
var hello = "Hello ";
function inner() {
var info = " in inner function";
console.info(hello + world + info);
}
inner();
}
sayHello(); //hello world in inner function
再谈同名变量
定义变量时,一定要使用var!如没写,就会是全局变量.
var myColor = "red";
//输出:myColor before myFunc() red
console.info("myColor before myFunc()", myColor);
function myFunc() {
//这里有没有var,很关键! 没写var, mycolor就变成全局变量
var myColor = "blue ";
//输出:myColor inside myFunc() blue
console.info("myColor inside myFunc()", myColor);
}
myFunc();
//输出:myColor after myFunc() red
//当第6行去掉var时,这里输出:myColor after myFunc() blue
console.info("myColor after myFunc()", myColor);
变量的查找过程
自下而上,由内至外
//变量的查找过程
var color = "blue";
function outer() {
function getColor() {
return color;
}
console.info(getColor()); //blue
};
outer();
Javascript我学之四作用域的更多相关文章
- 从头开始学JavaScript (二)——变量及其作用域
原文:从头开始学JavaScript (二)--变量及其作用域 一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符 ...
- 《前端之路》之四 JavaScript 的闭包、作用域、作用域链
04:JavaScript 的闭包 一.定义: 常规定义: 闭包的定义: 有权利访问外部函数作用域的函数. 通俗定义: 1.函数内部包含了函数.然后内部函数可以访问外部函数的作用域. 2.内部函数可以 ...
- javascript变量声明及作用域总结
javascript变量声明及作用域总结 一.总结 一句话总结:还是得好好看书,光看视频是不得行的,浅学无用,要相互印证,要真正理解才有用,比如<Javascript权威指南> 书 1.j ...
- javascript中的变量作用域以及变量提升
在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...
- javascript中的变量作用域以及变量提升详细介绍
在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解变量作用域 “一个变量的作用域表示这个变量存在的上下文 ...
- Javascript的块级作用域
一.块级作用域的说明 在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c. ...
- Javascript中闭包的作用域链
作用域定义了在当前上下文中能够被访问到的成员,在Javascript中分为全局作用域和函数作用域,通过函数嵌套可以实现嵌套作用域. 闭包一般发生在嵌套作用域中.闭包是JavaScript最强大的特性之 ...
- javascript模仿块级作用域(第一篇)
作用域有词法作用域和块级作用域之分,javascript属于词法作用域,而在java.C++中却是块级作用域.在javascript中,只有函数能够创建作用域,作用域是以function作为边界的. ...
- javaScript函数提升及作用域
代码片段: var a = 1; function foo() { console.log(a); //输出为undefined if (!a) { var a = 2; } alert(a); }; ...
随机推荐
- STS启动springboot项目,加载不了resources下的配置文件的问题
从这篇博客的评论中找到了解决方案 答案: eclipse的设置中,它默认是不包括resources下的文件的,把它改了就行了 原本用idea没这些事的,不过idea旗舰版到期了,社区版的话,对前端又没 ...
- Day 4 测试(QwQ 表示没考好 未完待续。。。 可能要过一段时间才会更
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #i ...
- 倍增\ tarjan求lca
对于每个节点v,记录anc[v][k],表示从它向上走2k步后到达的节点(如果越过了根节点,那么anc[v][k]就是根节点). dfs函数对树进行的dfs,先求出anc[v][0],再利用anc[v ...
- NOI2018游记
Day-1 下午报道,没什么好说的 Day0 先考笔试,开幕式咕到了下午 笔试没什么好说的,反正都是 \(100\) 好像有很多人被gedit坑了? 下午开幕式,很多省的口号都有意思,比如: &quo ...
- magento2 - Invalid credentials for 'https://repo.magento.com/packages.json', aborting.
错误如下: 登陆:https://developer.magento.com/找到路径-创建公钥与私钥: Developer Portal -> My Access Keys -> Cre ...
- 「洛谷3469」「POI2008」BLO-Blockade【Tarjan求割点】
题目链接 [洛谷传送门] 题解 很显然,当这个点不是割点的时候,答案是\(2*(n-1)\) 如果这个点是割点,那么答案就是两两被分开的联通分量之间求组合数. 代码 #include <bits ...
- Linux-GitLab安装及汉化
gitlab 安装及汉化 GitLab简介: GitLab是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的Web服务.可通过Web界面进行访问公开的或者私人项目.它 ...
- 20175221 2018-2019-2 《Java程序设计》第一周学习总结
20175221 2018-2019-2 <Java程序设计>第一周学习总结 教材学习内容总结 本周通过观看书本配套视频,学到了如解释器,编译器等一些简单概念. 还懂得了java的一些简单 ...
- 时间序列分析模型——ARIMA模型
时间序列分析模型——ARIMA模型 一.研究目的 传统的经济计量方法是以经济理论为基础来描述变量关系的模型.但经济理论通常不足以对变量之间的动态联系提供一个严密的说明,而且内生变量既可以出现在方程的左 ...
- [JDK8]性能优化之使用LongAdder替换AtomicLong
如果让你实现一个计数器,有点经验的同学可以很快的想到使用AtomicInteger或者AtomicLong进行简单的封装. 因为计数器操作涉及到内存的可见性和线程之间的竞争,而Atomic***的实现 ...