[ JS个人笔记 ] Hoisting&Scope Chain—DAY4

Hoisting

先了解什麽是Hoisting,也就是宣告提升。
此种行为现象主因,是由於js在初始编译阶段,先将变数&函式宣告式放入记忆体(此时无赋予值),而执行时可视为将变数与函式宣告式提升至作用域的最顶端。

范例:

b();
console.log(a);

var a = 'Hello World!';

function b() {
    console.log('Called b!');
}

可视为:

function b() {
    console.log('Called b!');
};
var a;

b();
console.log(a);

a = 'Hello World!';

注意!

  • 常见定义函式有两种

    • 函式宣告式(function declaration)
    • 函式运算式(function expression)
  • 函式宣告式会整个提升,而函式运算式则只会提升等号左的变数,并不会提升等号右边的函式

  • Hoisting 这个观念主要是要了解 JavaScript 记忆体运作的观念,实作上也会避免在 function 前方直接呼叫函式,这样会降低对於程序码的可维护性。

函式宣告式 : 在函式前方直接调用方法可运行
function call() {
console.log(123)
}

函式运算式 : 在函式前方直接调用方法不可运行
var call = function () {
console.log(123)
}

范例:

console.log(callSomeone); // undefined
callSomeone('杰伦哥'); // callSomeone is not a function
var callSomeone = function (name) {
  console.log('打给 ' + name)
}

Scope Chain

在 JS 中有称作 scope chain(范围链)的特性
JS在查找变数时 会循着范围链(Scope Chain)一层一层往外找
若函式内找不到 则往外找

范例:

var cat = "cat"

function a(){
  var cat = "kitty";
  b()
}

function b(){
  console.log(cat)
}

a() //cat
// 因b()函式在全域作用域,故直接抓全域下的变数cat
var cat = "cat"

function a(){
  var cat = "kitty";
  function b(){
    console.log(cat)
  }
  b()
}

a() //kitty
// 因b()函式在a()函式作用域里,故抓a()里的变数cat

陷阱题目

var cat = "cat"

function a(){
  cat = "kitty";
  b()
}

function b(){
  console.log(cat)
}


a() //kitty
// 因a()函式内的cat变数无宣告,故污染全域变数
var myVar = "outer";
function func(){
  console.log(myVar); // outer
  myVar = "inner";
}
func();
console.log(myVar); // inner
//在func()函数执行时,会先执行完console.log(myVar);後才污染全域变数myVar

<<:  Day 36 (MySQL+PHP)

>>:  安全评监(Security Assessment)

JS读书笔记30天 - Day30 感想

缘由 因为拖延症严重,想要强迫自己看课,所以如果把每天进度都写成了铁人30天的文章,为了不中断,造成...

Day 14 - Rancher - 其他事项

本文将於赛後同步刊登於笔者部落格 有兴趣学习更多 Kubernetes/DevOps/Linux 相...

公司防火墙架设後对外网页帐号密码错误

我们公司换防火墙之後 别台电脑对子公司网站登入 网页却可以正常开启 登入却一直显示帐号密码错误 只有...

【设计+切版30天实作】|Day30 - 最後一天了呜呜呜的30天参赛心得

感人时刻 今天是铁人赛30天的最後一天了,有种「嗯?30天了喔?」的奇妙感觉!毕竟已经习惯每天上来发...

Day-11 函式入门

如前文所述,在JavaScript中,除了基本型别一切都是物件。而函式(function)也不例外。...