arguments比较怪异,是个数组形式的对象,可以通过下表索引,比如arguments[0],arguments[1]等,但是它不是Array类型
typeof( arguments ) // Object arguments instanceof Array //false arguments instanceof Object //true
题目一:
var employee = "Tom" function getInfo(){ console.log(this.employee) } var person = { employee:"Jack", getInfo:function(fn){ fn(); arguments[0](); // arguments对象调用fn,相当于obj.fn()形式 ;(第一次见这种形式,有点不习惯); }, }; person.getInfo( getInfo, 2 ); //输出结果 “Tom” undefined
细细体会,这个题目在考察 "函数执行时,this指向" 问题;关于this指向,请记住:哪个对象(上下文)调用了函数,这个函数中的this就指向谁;如果没有对象调用,this默认指向window(非严格模式下);跟函数在哪里定义无关;
分析:
在执行 fn()时,没有对象调用fn,在非严格模式下,fn中的this指向window;(严格模式下,此时this为undefined);
在执行arguments[0]()时,arguments对象调用了fn,因此fn函数的this指向arguments对象,而不是person或者window;而arguments对象中没有employee,所以输出undefined
题目二:
var employee = "Tom" function getInfo(){ console.log(this.employee) } var person = { employee:"Jack", getInfo:getInfo, }; person.getInfo(); //输出结果 "Jack"
细细体会,这两个题目在考察 "函数执行时,this指向" 问题;关于this指向,请记住:哪个对象(上下文)调用了函数,这个函数中的this就指向谁;如果没有对象调用,this默认指向window(非严格模式下);跟函数在哪里定义无关;
题目二中,是person调用getInfo,所以这个函数的this指向person;
arguments 的长度问题
function Test(a,b,c){ console.log(arguments) } Test(1,2)// 此时 arguments.length =2 而不是 3; arguments表示的是实参,而不是形参;
区分函数长度、arguments长度; Test.length 为 3,表示形参长度; arguments.length表示实参长度