理解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);

第一题:答案undefined
js函数正式执行前会先处理函数声明、形参、变量声明(创建变量但是不赋值,赋值在代码执行阶段)。本例先在代码执行前处理变量声明,也就是解析器先弄一个变量a,但是没到函数执行呢,还不能给他赋值。所以有了变量a,注意是变量,全局变量相当于window的属性(其实不同,比如属性可以delete)所以”a” in window为true。

如果本题改为

if (!("a" in window)) {
    a = 1;
}

将不会优先处理变量声明,结果会不同。
作为对比可以改为如下,同样根据上面的说明作答,大家自己试试。

第二题:答案1

只要记住一点,命名函数表达式的名字仅在所定义的函数内有效,由ecmascript作用域链的构建规则决定。

第三题:答案 是一个函数

按照第一题的解释中所说,先处理函数和声明和变量声明,所以a是一个函数,而var a不会改变赋值嘛,此后又没有赋值,所以a一直都是函数。

第四题:答案10

js每一个函数内都有一个隐含的arguments变量,是一个类数组结构,依次记录了参数的值,与参数同步更改。

第五题:答案window

没啥可说的,默认用window。

 都答对了么?

原文地址:https://www.cnblogs.com/allyh/p/10680141.html