js引擎運行
第一次決議(也稱預決議):變數提升(含函式運算式)和函式提升
1?? 前提是在作用域function或script情況下2?? 只提升變數名到當前作用域最頂端,不賦值不呼叫
3?? 檢查語法錯誤(如有則都不執行)
第二次決議:代碼運行
從上到下,檢查運行錯誤(如有則不再往下執行)
作用域題目練習
請描述下面代碼的輸出結果以及運行原因
(作用域鏈表)題一
console.log(a);
var a = 10;
console.log(a);
var a = 20;
console.log(a);
b();
var b = function() {
console.log(a);
}
一解
/* 相當于執行以下代碼 */
var a;
console.log(a); // a無賦值,undefined
a = 10;
var a;
console.log(a); // 10
a = 20;
console.log(a); // 20
var b;
b(); // 沒有賦值就直接呼叫,Error報運行錯誤:b is not a function
b = function() {
console.log(a);
}

題二
var num = 10;
fun();
function fun() {
console.log(num);
var num = 20;
}
二解
/* 相當于執行了以下操作 */
var num;
function fun() {
var num;
console.log(num); // undefined
num = 20;
}
num = 10;
fun();

題三
var num = 10;
function fn() {
console.log(num);
var num = 20;
console.log(num);
}
fn();
三解
/* 相當于以下代碼 */
var num;
function fn() {
var num;
console.log(num); // underfined
num = 20;
console.log(num); // 20
}
num = 10;
fn();

題四
var a = 18;
f1();
function f1() {
var b = 9;
console.log(a);
console.log(b);
var a = '123';
}
四解
/* 相當于以下代碼 */
var a;
function f1() {
var b;
var a;
b = 9;
console.log(a); // undefined
console.log(b); // 9
a = '123';
}
a = 18;
f1();

題五
f1()
console.log(c);
console.log(b);
console.log(a);
function f1() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
五解
/* 相當于執行以下代碼 */
b=9;
c=9;
function f1() {
var a = 9; // 區別集體宣告變數var a=9, b=9, c=9;
b = 9; // 函式作用域內無宣告則b、c為全域變數
c = 9;
console.log(a); // 9
console.log(b); // 9
console.log(c); // 9
}
f1();
console.log(c); // 9
console.log(b); // 9
console.log(a); // Error報錯:a沒有被定義undefined

題六
var num = 1;
function demo() {
console.log(num);
function test() {
console.log(num);
num = 3;
console.log(num);
}
var num = 2
test();
}
demo();
六解
/* 相當于執行以下代碼 */
var num;
function demo() {
var num;
console.log(num); // underfined
function test() {
console.log(num); // 2
num = 3;
console.log(num); // 3
}
num = 2;
test();
}
num = 1;
demo();

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/152736.html
標籤:JavaScript
上一篇:微信互聯網安全受到國際威脅?
