函数内部属性
任何函数内部,都有两个特殊的对象,arguments 和 this。arguments为数组对象,包含传递的所有参数。this是它所处对象的作用域。
callee 属性
是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名函数的递归
或者保证函数的封装性
。
// 打印函数自身
function calleeDemo() {
console.log(arguments.callee);
}
// 用于匿名函数的递归调用
var sum = function(n){
if (n <= 0) return 1;
else return n + arguments.callee(n - 1)
}
比较一般的递归函数:
var sum = function(n){
if (1==n) return 1;
else return n + sum (n-1);
}
调用时:alert(sum(100));
在浏览器(客户端)中
,window对象是js中最大的对象,也是最外围的。所有全局的变量都是window的属性。
apply and call
两者都是把函数绑定到另外的一个作用域下面,区别仅仅在于参数,
apply(thisArg,argArray);// 第一个参数是作用域,
call(thisArg,[arg1,arg2…]); //第一个参数是作用域,第二个参数是一个数组
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1); //4 用 add 方法替换 sub 方法,this 指向 sub。
add.apply(sub, [3,1]); // add参数为数组
// 函数其实是一个对象,所以可以通过add.call 的方式调用属性。
常用的用法:
1. 查找数组里面最大的值(apply)
当数组中的元素不便一一列举或数组很大时 apply 方法很有用
Math.max.apply(null, [array]);
注: 当不把该函数指定到其它作用域下的时候,所以第一个参数可以写作null或者本身。
2. 判断数据的详细类型(call) 优点:更详细
Object.prototype.toString.call(value);// 返回的是 string 类型
可以准确的判断出8种数据类型和其它的js 原生类型。
比如会有 [object Date]
但是typeof 只会判断为 object。
使用typeof运算符的缺点是: null, array,Date等原生数据类型会判断为 object 类型, 并且返回的是 string 类型
console.log(typeof (typeof function(){})) // string
使用 instanceof 只能判断一个实例是不是属于一个对象
console.log(d instanceof Date());
var d = new Date();