var foo = {
bar: function(){ returnthis.baz; },
baz: 1
}
typeof (f = foo.bar)();
答案 "undefined"
继续改写一下:
var foo = {
bar: function(){ returnthis.baz; },
baz: 1
}
f = foo.bar;
typeof f();
把foo.bar存储给f然后调用,所以this在foo.bar引用的是全局对象,所以就没有baz属性了
换句话说
foo.bar执行的时候上下文是 foo,但是当 把 foo.bar 赋值给 f 的时候,f 的上下文环境是 window ,是没有 baz 的,所以是 ”undefined"
题目八
var f = (function f(){ return "1"; }, function g(){ return 2; })();
typeof f;
答案 "number"
逗号操作符的使用可以很混淆,但这段说明它的行为:
var x = (1, 2, 3);
x;
x的值是3,这表明,当你有一系列的组合在一起,并由逗号分隔的表达式,它们从左到右进行计算,但只有最后一个表达式的结果保存。由于同样的原因,这个问题可以改写为减少混乱:
var f = (function g(){ return 2; })();
typeof f;
关于逗号表达式:
原文:
http://www.2ality.com/2012/09/expressions-vs-statements.html
译文:
http://www.cnblogs.com/ziyunfei/archive/2012/09/16/2687589.html
题目九
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(){returnthis}或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];
typeoftypeof x;
答案
这题目比较简单,注意下返回类型即可
x = [,][1];
即 x = typeof y = 'undefind'.
typeof 返回的是string类型就可以了
typeof typeof必然就是'string'了.
View Code
题目十三
function(foo){
returntypeof foo.bar;
})({ foo: { bar: 1 } });
答案 "undefined"
又是一个恶心的题目,纯文字游戏,大家看仔细看
先分解一下
var baz = { foo: { bar: 1 } };
(function(foo){
returntypeof 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"
题目十四
with (function(x, undefined){}) length;
答案 2
with用得很少,with 语句就是用于暂修改作用域链的或者通常用来缩短特定情形下必须写的代码量
使用with语句的JavaScript代码很难优化,因此它的运算速度比不使用with语句的等价代码要慢得多。
而且,在with语句中的函数定义和变量初始化可能会产生令人惊讶的、相抵触的行为,因此我们避免使用with语句
with的用法是这样的:
with(object) {},在大括号里面,可以引用object的属性而不用使用object.attr这种形式。
这道题里面,with接受了一个对象,只不过这个对象是函数,函数有length属性,
代表形参的个数,所以上面返回的值是2
mozilla with
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Statements:with
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2012-07-05 setTimeout(0) 即将退役