# 301. 下面的代码输出什么?

var a = function () {
  return 5;
};
a.toString = function () {
  return 3;
};
console.log(a + 7);
1
2
3
4
5
6
7

参考答案:

10

因为会自动调用 a 函数的 toString 方法。

# 302. jquery 插件中形参 undefined 的作用

jquery 插件写法:

$(function (window, undefined) {
  2;
  3; //插件实现具体代码
  4;
  5;
})(window);
1
2
3
4
5
6

简单分析:

  • 代码最前面的分号,可以防止多个文件压缩合并而其他文件最后一行代码未添加分号引起的语法错误。
  • 一个立即执行的匿名函数,可以形成一个独立的执行作用域,可以避免其函数体内的局部变量污染全局。
  • 传入实参 window,可以减少作用域链的查询时间,从而提高执行性能。
  • 至于在匿名函数中定义一个 undefined 的形参变量,是未来防止在其他函数中 undefined 被重写,从而引起内部函数执行出错。

因为 undefined 并不是 js 关键字,这样它可以作为变量名来使用,比如:

function a() {
  var undefined = 5;
  alert(undefined);
}
a();
1
2
3
4
5

运行一下,在 IE 下,会弹出 5,而不是 undefined,也就是说全局的 undefined 有可能被其他函数覆盖的危险。

通过在匿名函数中多定义一个 undefined 的形参,由于只传入实参 window,从而可以保证 undefined 形参未被赋值,从而最终是我们想要的 undefined 的值。