先来道简单的热热身
Question 1 :
<script>
// 下列代码输出什么?
(function () {
var a = (b = 3);
})();
console.log('a defined? ' + (typeof a !== 'undefined'));
console.log('b defined? ' + (typeof b !== 'undefined'));
</script>
答案是:false true
解析:变量a的作用域是函数作用域,所以全局作用域不能读取到a,所以a是undefined,即第一个打印 false;
变量b的作用域为全局作用域,所以b为3,即第一个打印为true。
继续
Question 2 :
<script>
// 下列代码输出什么?
function fun(n, o) {
console.log(o);
return {
fun: function (m) {
return fun(m, n);
}
};
}
var a = fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
</script>
答案为:undefined 0 0 0
解析:fun(0)调用,传入一个参数0 - > n=0,o则没传值,所以为输出undefined,实例对象a然后返回一个对象{ fun: function(){}};
a.fun(1) : 调用,传入一个参数1 -> m=1,返回fun(1,0),o为0,所以打印 0;
a.fun(2) : 调用,传入一个参数2 -> m=2,返回fun(2,0),o为0,所以打印 0;
a.fun(3) : 调用,传入一个参数3 -> m=3,返回fun(3,0),o为0,所以打印 0;
Question 3 :
<script>
// 编程题:要求sum函数运行输出结果满足下列条件
console.log(sum(2, 3)); // 输出 5
console.log(sum(2)(3)); // 输出 5
</script>
答案(有多种方法):
<script>
function sum() {
var fir = arguments[0];
if (arguments.length === 2) {
return arguments[0] + arguments[1];
} else {
return function (sec) {
return fir + sec;
};
}
}
console.log(sum(2,3));// 打印 5
console.log(sum(2)(3));// 打印5
</script>
:Question 4:
<script>
// 下列代码输出什么?
var F = function(){}
var F = new Function();
Object.prototype.a = function(){}
Function.prototype.b = function(){}
var f = new F();
console.log(f.a,f.b,F.a,F.b);
</script>
答案:f(){} undefined f(){} f(){}
解析:沿原型链去找