87,910
社区成员
发帖
与我相关
我的任务
分享
/*!
8. var f = (function f() { return "1"; }, function g() { return 2; })();
typeof f;
*/
答案: 'number'.
解析: 考察了逗号(,)作为运算符的作用.(返回最后一个表达式的运算值). 这里就是(function g(){})(); 返回的是2就是'number'.
/*!
9. var x = 1; if (function f(){}) { x += typeof f; } x;
*/
答案: '1undefined'(ECMAScript).
解析: 原理同2题. 就是在ECMAScript中.函数作为运算表达式的时候是无法通过其名字访问的. 所以x += typeof f为'1undefined'.
/*!
10. var x = [typeof x, typeof y][1]; typeof typeof x;
*/
答案: 'string'.
解析: 这个也很容易理解x = [,][1]; 即 x = typeof y = 'undefind'. 需要知道typeof 返回的是string类型就可以了 typeof typeof
必然就是'string'了.
/*!
11. (function (foo) { return typeof foo.bar; })({ foo: { bar: 1 } });
*/
答案: 'undefined'.
解析: 不知道这道题目的意义. 就是打马虎眼了. 传入的foo参数是个{ foo: { bar: 1 } }. 然后foo参数.bar当然没有了.
/*!
12. (function f() {
function f() { return 1; }
return f();
function f() { return 2; }
})();
*/
答案: 2.
解析: [纠正:桃子你强调预编译.我认为这个是一直以来的错误.js解析语言哪来的预编译过程?].这个就是规则.函数声明(区别var a = function函数表达式)
会将他的scope提前.词法分析的时候 后一个f将前一个f覆盖了. 所以运行期的时候返回的是2.
/*!
13. function f(){ return f; }
new f() instanceof f;
*/
答案: false.
解析: new 的时候 如果constructor返回的是object或者function 那么就会覆盖原来的constructor. 所以typeof new f() 返回的是'function' 显然不能
instanceof任何东西了.
/*!
14. with (function (x, undefined) {}) { length; }
*/
答案: 2.
解析: 函数的length得到的是函数实名参数的个数. 这里一个x一个undefined就是2个.
/*!
1. (function(){ return typeof arguments; })();
*/
答案: "object".
解析: 没啥说的arguments类数组对象.本身类型就是Object的.
/*!
2. var f = function g(){ return 23; }; typeof g();
*/
答案: Error(ECMAScript).
解析: function两种形式:[1]函数声明 [2]函数表达式(或函数运算).显然这里是函数表达式. 这段代码就是:
创建一个函数g并赋值给变量f. 这个函数g作为运算的时候可以当做匿名函数来对待.是不能通过名字访问到得(非ECMA例外).
/*!
3. (function (x) { delete x; return x; })(1);
*/
答案: 1.
解析: arguments不能delete.但不产生错误异常. 所以delete x返回false.即 x没有被删除. 所以return x 为 1.
/*!
4. var y = 1, x = y = typeof x; x;
*/
答案: 'undefined'.
解析: 没啥说的. = 运算顺序 由右至左. typeof x == 'undefined'.
/*!
5. (function f(f) { return typeof f(); })(function(){ return 1; });
*/
答案: 'number'.
解析: 我认为这道题考察点为当参数和函数重名时的优先级问题. 答案就是argument > function. 所以传入的函数return 1.
typeof 1为'number'.
/*!
6. var foo = { bar: function () { return this.baz; }, baz: 1 };
(function () { return typeof arguments[0](); })(foo.bar);
*/
答案: 'undefined'.
解析: 考察了this. this是运行时属性.取决于运行时的环境而非声明时的环境. 这里当执行arguments[0]()时this指向的当前
环境为argument. 所以argument.baz是undefined.
/*!
7. var foo = { bar: function(){ return this.baz; }, baz: 1 };
typeof (f = foo.bar)();
*/
答案: 'undefined'.
解析: 同6. f = foo.bar. 将其赋值给全局变量f.那么这时候的this就指向了window. window.baz也是undefined.
第二题. 考察的是FunctionDeclaration和FunctionExpression的区别.
详细参考ECMA文档第13章节Function Definition的 NOTE部分即可.
第五题. 我认为没啥可争的.很简单的问题.理解角度不同.但本质一样.