題目一bash
var num1 = 55;
var num2 = 66;
function fn(num,num2) {
num = 100;
num1 = 100;
num2 = 100;
console.log(num);
console.log(num1);
console.log(num2);
}
fn(num1,num2);
console.log(num1);
console.log(num2);
console.log(num);
複製代碼
答案:100 100 100 100 66 num報錯ide
解析: 預解析函數
var num1;
var num2;
function fn(num,num2) { // num = 55,num2 = 66
var num,num2;
num = 100;
num1 = 100; => 全局變量會覆蓋函數外面的num1
num2 = 100;
console.log(num); // 100
console.log(num1); // 100
console.log(num2); // 100
}
num1 = 55;
num2 = 66;
fn(num1,num2);
console.log(num1); //100
console.log(num2); // 66
console.log(num); //沒有聲明 報錯
複製代碼
題目2ui
fn3();
console.log(c);
console.log(b);
console.log(a);
function fn3() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
複製代碼
答案: 9 9 9 9 9 報錯this
解析:spa
預解析:把函數提高到當前做用域最頂端。 var a = b = c = 9; => var a = 9; b = 9; c = 9; 這裏b,c是全局變量。 因此函數裏面 a,b,c打印都爲9。函數外面b,c是全局變量打印都爲9。a爲局部變量因此報錯(未定義)。code
題目3ip
var n = 0;作用域
function a () {
var n = 10;
function b() {
n++;
console.log(n);
}
b();
return b;
}
var c = a();
c();
console.log(n)
複製代碼
答案:11,12,0it
解析:
a() => function b() {
n++;
console.log(n);
}
n函數a聲明瞭n爲10,此處n++,打印n爲11。
c() => 又調用了一次a() => 這時n爲11 => n++ => 12。
最後n打印的是全局變量,因此爲0。
複製代碼
題目4
var x = 10;
function fn() {
console.log(x);
}
function show(f) {
var x = 20;
f();
}
show(fn);
複製代碼
答案:10
解析:
在函數內定義的變量不能在函數以外的任何地方訪問,由於變量僅僅在該函數的域的內部有定義。相對應的,一個函數能夠訪問定義在其範圍內的任何變量和函數。換言之,定義在全局域中的函數能夠訪問全部定義在全局域中的變量。在另外一個函數中定義的函數也能夠訪問在其父函數中定義的全部變量和父函數有權訪問的任何其餘變量。 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Functions
題目5
var fn = function() {
console.log(fn);
}
var obj = {
fn2 : function() {
console.log(fn2);
console.log(this.fn2);
}
}
obj.fn2();
複製代碼
答案:
fn2報錯未定義 。
function() {
console.log(fn2);
console.log(this.fn2);
}
複製代碼
解析:obj裏fn2沒有聲明。因此報錯。this指向的obj。因此obj.fn2打印的函數。
題目6