函数属性&arguments
例:
function foo(x,y,z){
console.log(arguments.length); //2 实参个数
console.log(arguments[0]); //1 arguments是类数组与Array不同
arguments[0]=10;
console.log(x); //10
严格模式下,这里x为1
arguments[2]=100;
console.log(z); //still undefined,只传入了两个参数,不存在第三个参数
console.log(arguments.callee===foo); //true callee是arguments的一个属性,包含当前正在执行的函数
严格模式下,callee不能使用
}
foo(1,2);
foo.length; //3 形参个数
foo.name; //函数名称
apply/call方法(浏览器)
例:
function foo(x,y){
console.log(x,y,this);
}
foo.call(100,1,2); //1,2,Number(100)
foo.apply(true,[3,4]); //3,4,Boolean(true)
foo.apply(null); //undefined undefined window(global对象)
严格模式下,this返回null
foo.apply(undefined); //undefined undefined window(global对象)
严格模式下,this返回undefined
bind与currying
例1:
function add(a,b,c){
return a+b+c;
}
//函数柯里化是把一个函数拆分成多个单元,有时候我们不需要将函数一次性调用完,例如上面的例子,而是调用把前两个参数传完了得到这样的函数并且再去传入第三个值
例2:
var func=add.bind(undefined,100); //这里,通过bind绑定了第一个参数a
func(1,2); //103 再将1,2赋值给b,c
var func2=func.bind(undefined,200); //这里又绑定了一次,这回绑定给了第二个参数b
func2(10); //310 所以这里的10是传给参数c
应用:
function getConfig(colors,size,otherOptions){
console.log(colors,size,otherOptions);
}
var defaultConfig=getConfig.bind(null,'#d07090','1024*768');
defaultConfig('123');
defaultConfig('456'); //可以固定前两个参数的值,在做修改时,只会改变第三个参数的值,提高了便利性
bind与new
例:
function foo(){
this.b=100; //创建一个全局变量b
return this.a;
}
var func=foo.bind({a:1});
func(); //1
new func(); //{b:100}(对象名字为foo) 在使用new时,this会指向一个空对象,空对象的原型会指向foo.prototype,空对象的这个b属性会被赋值为100,并会忽略掉return,也就是当使用new时,bind方法会被忽略掉