1.
var f = function g() {
return 23;
};
typeof g();
结果:Error
var f = function {} 这样是一个函数表达式,
var f = function g() {}这样写不规范,浏览器会报错。
2.
var foo = {
bar: function () {
return this.baz;
},
baz: 1
};
(function () {
return typeof arguments[0]();
})(foo.bar);
bar: function () {
return this.baz;
},
baz: 1
};
(function () {
return typeof arguments[0]();
})(foo.bar);
结果:“undefined”
把 foo.bar 作为实参传给匿名函数,foo.bar() 相当于一个函数,这和普通的 函数名() 没有区别,而对于
function test() {
alert(this)
};
test();
上面这个和 window.test() 一样,所以这时候的this指向 window
因为在 window 中找不到 baz 所以输出"undefined"
3.
var x = [typeof x, typeof y][1];
console.log(typeof typeof x);
console.log(typeof typeof x);
结果是 "string"
因为 typeof x 无论怎样最后都是返回的字符串。
另外 alert(x) 输出的是 "undefined"
注意:
var y = [1,2,3][1];
console.log(y); // 2
说明后面的那个 1 不是指数组长度而是指索引位置,最后返回的是数组中的某一项而不是一个数组。
对于
var x = [typeof x, typeof y][0];
console.log(x); // undefined
console.log(typeof x); // string
难道是因为先预解析,这个时候是 x 是 undefined,而 typeof undefined 的值就是 undefined
4.
alert(function (x, undefined) {}.length);
结果:2
function a (num1,num2){ }
alert(a.length) // 2
函数名.length 输出的是形参长度
arguments.length输出的是实参长度
5.
function f() {
return f;
}
new f() instanceof f;
return f;
}
new f() instanceof f;
结果:false
关键在于 那个 return f,new f() 最后其实是一个 f,而不是 f 的实例。
这里也说明 new f() 其实是执行了 一次 f 函数,所以才会返回 f ?
6.
(function f() {
function f() {
return 1;
}
return f();
function f() {
return 2;
}
})();
function f() {
return 1;
}
return f();
function f() {
return 2;
}
})();
结果:2
函数声明会预解析,而
function f() {
function f() {
return 1;
}
function f() {
return 2;
}
}
function f() {
return 1;
}
function f() {
return 2;
}
}
第二个会覆盖掉第一个
7.
(function (foo) {
return typeof foo.bar;
})({
foo: {
bar: 1
}
});
return typeof foo.bar;
})({
foo: {
bar: 1
}
});
结果:undefined
实参是
{
foo: {
bar: 1
}
}
foo: {
bar: 1
}
}
里面只有 foo 这一个属性,没有 bar 属性,因此结果是"undefined"
8.
var x = 1;
if (function f() {}) {
x += typeof f;
}
x;
if (function f() {}) {
x += typeof f;
}
x;
结果:"1undefined"
if (function f() {}) 这样写是错误的,因此函数声明不能写在运算符中。但是注意 if() 的假值只有 false , NAN , null , undefined , 0 , ""
这6个,对于其他的都是真,因此 if (function f() {}){}可以执行
9.
var f = (function f() {
return "1";
}, function g() {
return 2;
})();
alert(typeof f);
return "1";
}, function g() {
return 2;
})();
alert(typeof f);
结果:"number"
涉及到 分组选择符 这个知识。
var a = (1,2,3);
alert(a) // 3
alert(a) // 3
所以最后返回的是 2,number 型
10.
(function (x) {
delete x;
return x;
})(1);
delete x;
return x;
})(1);
结果:1
注意 delete 的适用范围,只能删除对象下面的属性。