题目一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