您的位置:首页 > Web前端 > JavaScript

javaScript学习随笔

2013-06-06 14:27 218 查看
偶然间看见一篇文章,惊叹之余,倍感汗颜啊《So, you think you know JavaScript?》

先看看他的题目吧:

//题目一
if (!("a" in window)) {
var a = 1;
}
alert(a);
//题目二
var a = 1,
b = function a(x) {
x && a(--x);
};
alert(a);
//题目三
function a(x) {
return x * 2;
}
var a;
alert(a);
//题目四
function b(x, y, a) {
arguments[2] = 10; alert(a);
}
b(1, 2, 3);
//题目五function a() {
alert(this);
}
a.call(null);
不知道,全部能答对的有多少人。而后研究其原因,仍有许多不解,后看了七月对其的分析后,毛瑟顿开,并最学习记录

下面对上面的题目做以分析:

第一题:

首先,js中可以用 "变量名" in window 来判断全局变量中是否有该变量名,然后我们要知道,javascript引擎对变量的声明和复制的方式。

在javascript中,它会首先扫描js总所有的变量名声明,并将它提到最上面,我们看一个例子:

alert("a" in window);
var a;
//其运行结果为true,也就证明了javascript引擎在运行时实际的js是:
var a;
alert("a" in window);
//最后需要补充的是,javascript中虽然变量名声明提前了,但它的赋值并没有提前。
//这样,第一题就等同于
//变量被提前了
var a;
//所以a就是window中变量了,所以为false
if (!("a" in window)) {
a = 1;
}
alert(a);


第二题:

同样,有以下知识点:

1.函数的声明同变量名的声明一样,同样会提前执行(注:是函数的声明 ,如 function a(){alert()},而不是 var a = function(){});

2.函数的声明优先级大于变量名的声明,也就是说,函数的声明会覆盖变量名,如:

function a (){
alert();
}
var a ;
alert(a);
//但是,虽然函数名会覆盖变量名,但是不会覆盖赋值,如将上面的代码改为
function a (){
alert();
}
var a = 1;
alert(a);
第三题:

第三题很简单,知道上面的知识点的话,很容易找到答案

第四、第五题主要是对

"arguments" 和 call的应用问题,可以去w3c中看,哪里有很详尽的解释。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: