javascript quiz
javascript 测试题,来自 Baranovskiy’s JavaScript quiz
第一题
if (!("a" in window)) { var a = 1; } alert(a);
var a; if (!("a" in window)) { a = 1; } alert(a);
延伸知识
- 全局变量 var a=1 等同于 window.a=1
- “a” in window 检测 window 是否包含叫 “a” 的变量
- alert(“a” in window);var a; 会报告 true(变量声明会被提升)
- var a=1 其实是两句话: var a;a=1;
第二题
var a = 1, b = function a(x) { x && a(--x); }; alert(a);
代码解读:声明 a=1,b 是函数,函数名也叫 a,内容为 递归减一,然后与 x 逻辑与
Why?
原因:有名称的函数表达式,其名称只存在于函数内部。看看这篇 javascript function 的那些事,其它那些函数里面的定义都是打酱油的
延伸知识
- function expressions 不会被 hoisted
第三题
function a(x) { return x * 2; } var a; alert(a);
代码解读:先 声明函数 a,再 声明变量 a
Why?
原因:函数声明 优先于 变量声明
延伸知识
- 函数声明(function declaration)会被提升(hoisting);和上面提到的 变量提升variable declaration hoisting 一个道理 function a(){} 等同于 var a=function(){} 并且被提升
函数声明 优先于 变量声明,但不能优先于 变量初始化,如
var value; function value(){ return 1; } alert(typeof value); //"function"
结果是: “function”(函数声明 优先于 变量声明)var value=3; function value(){ return 1; } alert(value);
结果是: 3(不能优先于 变量初始化)
第四题
function b(x, y, a) { arguments[2] = 10; alert(a); } b(1, 2, 3);
代码解读:函数 b 有三个参数,第三个 永远是设置为 10,alert 第三个
Why?
原因:arguments 数组永远和参数串保持一致
延伸知识
其实 arguments 和 参数串 占用不同的内存空间。(The two memory spaces are kept synchronized by the JavaScript engine, which means that both arguments[2] and a contain the same value at all times.)
第五题
function a() { alert(this); } a.call(null);
代码解读:定义函数 a alert this 变量,调用 a(无参数)
Why?
原因:函数 a 的当前 object 就是 window 对象
延伸知识
this(当前对象)返回的是 当前外面最近的 object 容器
var object = { method: function() { alert(this === object); //true } } object.method();
a.call( b ) 解读为: 在 b 对象执行 a 方法
function method() { alert(this === window); } method(); //true method.call(document); //false
function write() { console.log(this); } write(); write.call(document);
call(或者 apply)第一个参数为 null 或者 undefined 的话,该方法对 向上找到全局对象 执行该方法
If thisArg is null or undefined, the called function is passed the global object as the this value. Otherwise, the called function is passed ToObject(thisArg) as the this value.