今天在刷面试题的时候发现了一道很有意思的js有关this的ti如下
let length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function(fn) {
fn();
arguments[0](); //这个也是个点
}
};
obj.method(fn, 1);//输出是什么?
第一反应这不是比较简单的至少确定会输出一个 10 但是真的是这样吗?好像这和你的想法有一定的不同 先不考虑 arguments[0] () 。在浏览器中跑一下如下
wc这个1是什么鬼哪来的?我把这段代码放到vscode下的html中重新跑一下 给我打印了 0
我去。我淡淡的骂了个娘开始找原因(其实这个地方的length定义时为let这个可以说明length在window上是没有的,但是这个地方fn调用的时候this肯定是指向window的。但是不同的环境下为什么一个返回1,一个返回0。)最后我发现window.length 返回的是当前窗口中frames的数量(包括IFRAMES),这个算是属性上的一个补充。。。
这个地方一定要注意的是let,使用let和const定义的属性不在window 上。 有兴趣的可以去看理解var、let/const——从规范文档出发。
接下来说arguments[0]()
这里通过arguments[0] () 进行调用的时候。fn其实是在arguments上调用。arguments是一个类数组,
类似于这种结构的。上面的 0 代表就是在0下表参数传入的值。这里 0 就是传入的fn。所以此时在进行调用的时候this指向的是arguments。所以打印的是 2 (此时传入了两个参数,所以length为2)