//第一题
(1)
* 代码看起来是想说:如果window不包含属性a,就声明一个变量a,然后赋值为1。
* 你可能认为alert出来的结果是1,然后实际结果是“undefined”。要了解为什么,我们需要知道JavaScript里的3个概念。
*首先,所有的全局变量都是window的属性,语句 var a = 1;等价于window.a = 1; 你可以用如下方式来检测全局变量是否声明:
if (!("a" in window)) {
var a = 1;
}
console.log(window.a);//undefined
alert(a); //undefined
//(2):解析
* 此时,尽管声明是在alert之后,alert弹出的依然是true,
* 这是因为JavaScript引擎首先会扫墓所有的变量声明,然后将这些变量声明移动到顶部,
alert("b" in window); //true
var b;
// 最终的代码效果是这样的:
/!*var b;
alert("b" in window);*!/
你真懂js吗?//题目二
var a = 1,
b = function a(x) {
x && a(--x);
};
alert(a);//1
* 这个题目看起来比实际复杂,alert的结果是1;这里依然有3个重要的概念需要我们知道。
* 首先,在题目1里我们知道了变量声明在进入执行上下文就完成了;
* 第二个概念就是函数声明也是提前的,所有的函数声明都在执行代码之前都已经完成了声明,和变量声明一样。
澄清一下,函数声明是如下这样的代码:
function functionName(arg1, arg2){
//函数体
} ;
*如下不是函数,而是函数表达式,相当于变量赋值:
* var functionName = function(arg1, arg2){
//函数体
};
*
//题目三
function a(x) {
return x * 2;
}
var a;
alert(a);
*/
/*
* 执行a的时候,相应地就弹出了函数a的内容了。
//题目四
function b(x, y, a) {
arguments[2] = 10;
alert(a);
}
b(1, 2, 6); //10
function b(x, y, a) {
arguments[2] = 10;
alert(a);
}
b(1, 2); //undefined
//题目五
function a() {
alert(this);
}
a.call(null);
//(2)
function method() {
alert(this === window);
}
method(); //true
method.call(document); //false
/*第一个依然是true没什么好说的,第二个传入的调用对象是document,自然不会等于window,所以弹出了false。*/
function a() {
alert(this);
}
//a.call(window);//[object Window]
//总结:这5个题目虽然貌似有点偏,但实际上考察的依然是基本概念,只有熟知了这些基本概念才能写出高质量代码。
网友评论