[Day12] 从 function 谈变数的 Scope

说到 function ,又要回头来谈变数在 function 的 scope(作用域)
先宣告一个例子:

var a = 100;
var func1 = function (x) {
  var a = 13;
  return a + x; 
};
console.log(func1(7)); // 20
console.log(a); // 100

宣告在外面的 a 属於全域变数,而在 func1 {} 大括号内的 a 属於区域变数,虽然变数名称一样,但因作用域不同,内部宣告的值只存在这个函式,所以可以视为两个不同的变数。
而 function 里宣告的 a 只会作用在 {} 大括号内,所以这就是 console.log(a) 是 100 的原因。

在 ES6 以前切分变数有效范围的最小单位是 "function" -- 008

如果 function 内没有 var a 的话,function 会一层一层往外找,这里就会找到全域的 var a,如下例:

var a = 100;
var func1 = function (x) {
  return a + x; 
};
console.log(func1(7)); // 107
console.log(a); // 100

由此可知,内层可以读到外层宣告的变数,而外层拿不到内层宣告的变数,为什麽会强调宣告呢?因为有一个很需要注意的情况,还记得前面[Day02] 变数提到的

「未宣告的变数也能直接赋值,但是会有後遗症」

Javascript 会往外层寻找有没有变数叫 a,直到找到为止,也就是全域物件。未经宣告直接再次赋值改变了外层变数的值,同时也影响了外层读取 a 的结果。

var a = 100;
var func1 = function (x) {
  a = 13; // 直接赋值改变了外层同名变数 a
  return a + x; 
};
console.log(func1(7)); // 20
console.log(a); // 13

参考资料
008 天重新认识 JavaScript


<<:  DAY12:玉山人工智慧挑战赛-中文手写字辨识(前言)

>>:  [Day27] React - 建立子元素

[Day29]Flutter Netflix UI 底部导航栏上的通知数量

大家好,上一篇我们成功在Android手机上接到通知,今天我们在底部导航栏上显示通知 先设置一个变数...

[Day09] 选择困难再度发作之主题挑选

在昨天的文章中,我们先挑选了一个 Ananke 做为例子,今天我们来聊聊怎麽挑选主题,还有我在选择主...

我们的基因体时代-AI, Data和生物资讯 Day11-基因疗法中之腺病毒载体与机器学习

上一篇我们的基因体时代-AI, Data和生物资讯 Day10-基因疗法中之腺病毒载体与机器学习分享...

DAY12-JAVA的类别(6)-变数和函数

实例变数 实例变数(instance variable)拥有储存资料成员的记忆体空间,不与其他物件共...

【Day03】数据输入元件 - Radio

元件介绍 Radio 是一个单选框元件。让我们在一组选项当中选择其中一个选项。当我们的情境是希望用户...