【转】外国朋友出的js题目,你能对几道
发布时间:2020-12-27 02:22:01 所属栏目:运营 来源:网络整理
导读:原文地址?http://perfectionkills.com/javascript-quiz/ 中文地址加解释:by Aaron:http://www.cnblogs.com/aaronjs/p/3172112.html 附带了自己的理解,答案有争议的地方欢迎大家指出 题目一 2 3 4 ( function (){ ?? return ? typeof ? arguments; })(); ?
题目九var x = 1;
if (function f(){}) {
x += typeof f;
}
x;
"1undefined"
这里有个难点
if 中的 function f(){} 要如何处理?
函数声明的实际规则如下:
函数声明只能出现在程序或函数体内。从句法上讲,它们 不能出现在Block(块)({ ... })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。
假设代码我们不妨变一下:
var x = 1;
if (function(){}) {
x += typeof f;
}
x;
var x = 1;
x += typeof f;
x;
f在这了没有被定义,所以typeof f 是字符串"undefined" ,字符与数字相加结果也是一个字符串,所以最后的x就是"1undefined"了
题目十(function f(){
function f(){ return 1; }
return f();
function f(){ return 2; }
})();
2
如果是一直看下来的话,这个题目应该是比较简单
简单的来说在执行return之前,函数声明会在任何表达式被解析和求值之前先被解析和求值,
即使你的声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值,
参考如下例子,函数fn是在alert之后声明的,但是在alert执行的时候,fn已经有定义了
alert(fn());
function fn() {
return 'Hello world!';
}
所以题目中函数提升了两次,第二次把第一次覆盖了,
所以 return 后面的 f 是 return 语句的下一条语句声明的函数 f 。
注意自执行函数 (function f (){})(); 中的 f 并没有函数提升效果,它是表达式
题目十一function f(){ return f; }
new f() instanceof f;
false
怎样去理解?
new f()
首先这个操作会创建一个新对象并调用构造函数函数这一新的对象作为它的当前上下文对象
简单的说
new f();
依稀记得高级程序设计里面是这么说的:
1 创建空对象。
2 将类的prototype中的属性和方法复制到实例中。
3 将第一步创建的空对象做为类的参数调用类的构造函数
默认如果没有覆盖这个空对象的话,返回this
var a = new Object;
a instanceof Object 为 true
我们在看 f() 返回了 return f;
那么也就是说这个新的对象是是自身,构造函数本身在 new 的过程中会返回一个表示该对象的实例。
但是函数的返回值覆盖了这个实例,这个new 就形同虚设
果f的形式为 function f(){return this}或function f(){}就不一样
var a = new f();
a instanceof f // false
值得注意的是 instanceof 检测的是原型
又附上我博客的
JS 对象机制深剖——new 运算符
http://www.cnblogs.com/aaronjs/archive/2012/07/04/2575570.html
题目十二var x = [typeof x,typeof y][1]; typeof typeof x; 答案
这题目比较简单,注意下返回类型即可 x = [,][1]; 即 x = typeof y = 'undefind'. typeof 返回的是string类型就可以了 typeof typeof必然就是'string'了. 题目十三function(foo){
return typeof foo.bar;
})({ foo: { bar: 1 } });
"undefined"
又是一个恶心的题目,纯文字游戏,大家看仔细看
先分解一下
var baz = { foo: { bar: 1 } };
(function(foo){
return typeof foo.bar;
})(baz);
去掉函数关联
var baz = { foo: { bar: 1 } };
var foo = baz;
typeof foo.bar;
最后,通过替代我们除去中间变量foo
var baz = { foo: { bar: 1 } };
typeof baz.bar;
所以现在就很清晰了,属性中没有定义baz;它被定义为baz.foo上了,所以结果是:”undefined"
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



