本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘

作用域

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();

最新文章

  1. [PAT]素因子分解(20)
  2. 【C语言学习】《C Primer Plus》第11章 字符串和字符串函数
  3. 外网主机访问虚拟机下的web服务器(NAT端口转发)
  4. JQuery.Ajax()的data参数类型
  5. Web的Ajax应用开发模式(三)——Ajax的开发
  6. 67. Container With Most Water
  7. [CS231n-CNN] Backpropagation(反向传播算法)
  8. ECMAScript 发展历史
  9. 常用的50条linux 命令
  10. SpringMVC(一)——流程框架总体介绍
  11. Android测试TestSuite的执行方法
  12. python2.x 使用protobuf
  13. Android异步处理技术
  14. js 抛物线 笔记备份
  15. 谈谈JAVA中的安全发布
  16. 2018 Multi-University Training Contest 1
  17. 3星|《CMO到底能干多久?》:CEO必须决定供公司需要哪类CMO
  18. New Year Tree 【DFS序+线段树区间查询修改+二进制保存状态】
  19. ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务
  20. TortoiseSvn 取消忽略的文件

热门文章

  1. bzoj 3223: Tyvj 1729 文艺平衡树 (splay)
  2. 11.4 Flask session,闪现
  3. Python--Linux上安装Python
  4. Flink部署-standalone模式
  5. MySQL_列值为null对索引的影响_实践
  6. 金融量化分析【day111】:Matplotib-画布与子图
  7. Hadoop记录-JMX参数
  8. centos7防火墙设置
  9. DirectX11 With Windows SDK--09 纹理映射与采样器状态
  10. [物理学与PDEs]第5章习题7 各向同性材料时稳定性条件的等价条件