函数也是对象,也有属于自己的属性
但是使用console.log(fn) 打印的是函数体代码,要想获取函数对象自己的属性需要使用console.dir(fn)
//函数也是对象,也会有自己默认成员
function fn(){};
console.dir(fn);
/*
call与caller与callee的区别
call : 属于 Function.prototype. 作用是修改函数中的this指向
caller : 属于 函数对象的成员. 作用是获取调用这个函数的引用(我被谁调用了)
callee: 属于 arguments对象的, 作用是获取函数本身 (匿名函数递归调用)
*/
//1.caller: 获取调用这个函数的引用(我被谁调用了)
/*
a. 如果在函数B中调用函数A,那么函数A的caller就是函数B
b. 如果是全局调用(window来调用),那么函数的caller就是null
*/
function fn1(){
console.log('哈哈');
console.log(fn1.caller);//fn2
};
function fn2(){
fn1();
console.log('嘿嘿');
};
fn2();
fn1();//window.fn1()
//2.length: 获取形参的个数
function fn3(a,b,c,d){
console.log(fn3.length);//4
};
console.log(fn3.length);//4
fn3(10,20,30);
//3.name : 获取函数名字
function fn4(){
console.log(fn4.name);//fn4
};
console.log(fn4.name);//fn4
fn4();
//4.arguments : 获取所有的实参
function fn5(num){
//arguments:伪数组,本质是对象
// console.log(fn5.arguments);//函数对象的一个属性 arguments
// console.log(arguments);//js基础学习的arguments关键字
/*arguments是一个对象,也有自己的属性
callee: 获取函数自身 (匿名函数递归调用)
length: 获取实参的个数
*/
// console.log(fn5.arguments.length);
// console.log(fn5.arguments.callee);//fn5
//函数对象的arguments属性 和 arguments关键字 是同一个对象吗? 不是同一个
/*
1. arguments关键字最常用
2. arguments属于函数中的关键字, 函数名.arguments属于函数对象的属性
arguments关键字作用:获取函数所有的实参。与形参一一对应
函数名.arguments : 只能获取实参。 不与形参一一对应
*/
// console.log(arguments === fn5.arguments);//false
/* 使用最多最牛逼的arguments关键字
*/
console.log(num);//10
//修改形参:arguments也会改
num = 100;
console.log(arguments); // Arguments(5)
// 0: 100
// 1: 20
// 2: 30
// 3: 40
// 4: 50
// callee: ƒ fn5(num)
// length: 5
// Symbol(Symbol.iterator): ƒ values()
// __proto__: Object
//修改arguments,形参也会改
arguments[0] = 500;
console.log(arguments);// Arguments(5)
// 0: 500
// 1: 20
// 2: 30
// 3: 40
// 4: 50
// callee: ƒ fn5(num)
// length: 5
// Symbol(Symbol.iterator): ƒ values()
// __proto__: Object
console.log(num);
console.log(fn5.arguments);
};
fn5(10,20,30,40,50);
//递归函数:自己调用自己
// (function(){
// console.log(111);
// //如果想在匿名函数中调用自身
// arguments.callee();
// })();
网友评论