正文
(){
return
1
;
});
答案:”number”
为了便于理解我们继续分解:
第一部分
var baz = function(){ return 1; };
第二部分
(function f(f){
return typeof f();
})(baz);
在这里,函数f接受一个参数是另一个函数,f函数内部执行这个实参函数并且返回类型
无论是从调用该函数返回,即使参数名称f与函数名冲突,函数接受本身作为自己的参数,然后调用,此时就看谁更具有更高的优先级了,显然,参数的优先级更高,所以实际执行的是return typeof 1
题目六
var foo = {
bar: function() { return this.baz; },
baz: 1
};
(function(){
return typeof arguments[0]();
})(foo.bar);
答案: “undefined”
为什么是”undefined”?我们必须要知道this运算符是怎么工作的。
JS语言精粹总结的很精炼:
-
纯粹的函数调用
-
作为对象方法的调用
-
作为构造函数调用
-
apply调用
我们看看题目是属于那种环境?
在arguments
0
中执行了一个方法,arguments[0]就是foo.bar方法,注意:这在foo.bar中的this是没有绑定到foo。虽然 foo.bar 传递给了函数,但是真正执行的时候,函数 bar 的上下文环境是 arguments,并不是 foo。
arguemnts[0] 可以理解为 arguments.0(不过写代码就不要这样了,语法会错误的),所以这样看来,上下文环境是 arguemnts 就没问题了,所以在执行baz的时候自然this就是window了,window 上没有baz属性,返回的就是undefined,typeof调用的话就转换成”undefined”了。
题目七
var foo = {
bar: function(){ return this.baz; },
baz: 1
}
typeof (f = foo.bar)();
答案 “undefined”
继续改写一下:
var