实例成员与静态成员
实例成员:由构造函数创建的对象的成员。
静态成员:构造函数的成员
一般在使用的时候, 将通用的方法由静态成员提供, 实例成员如果要实现该功能, 调用静态成员来实现
构造函数的部分属性
1、name
语法:函数名.name
作用:返回构造函数名字
function f (){}
console.log(f.name) // f
2、length
语法:函数名.length
作用:返回构造函数参数列表形参的个数,arguments.length获得调用方法时实参的个数
function f (a,b,c){
console.log(arguments.length)
}
console.log(f.length) // 3
f(1,2); //2
3、caller
语法:函数名.caller
作用:返回调用该函数的函数,已被废除
function foo () {
console.log( foo.caller );
}
foo(); //无函数在调用foo,打印null
function f () {
foo();
}
f(); //在函数f内调用foo,打印函数f
递归
所谓递归就是自己调用自己。
function f(){
f();
}
f(); //死递归导致报错
arguments.callee 指向当前函数
function f(){
arguments.callee();
}
f(); //死递归导致报错
闭包
在函数内部允许访问外部的变量, 但是反之不允许
function fn (){
var a = 0;
return function (){
return a;
};
}
此时便可访问到fn函数内部的变量
获得闭包内多个变量,可以返回对象实现
function fn (){
var a = 0;
var b = 1;
return {
getA : function(){ return a; }
getB : function(){ return b; }
};
}
var f = fn();
console.log(f.getA());//0
console.log(f.getB());//1
沙箱模式
在 js 中, 只有函数可以限定变量的作用域,自然只有函数可以实现隔离。
(function(){
//.......
})()
在该自调用函数中,所有定义的变量只在函数内生效,避免污染全局变量。如果需要使用沙箱内的变量可移动过挂在window的方式提供访问接口。
(function(){
var a = 10;
var b = 20;
window.a = a;
})()
console.log(a); //10
console.log(b); //报错
函数的调用模式
1、函数模式
直接调用方法,属于函数模式,this指向window对象
function fn(){
console.log(this);
}
fn();//Window
2、方法模式
函数属于某个对象的属性,使用对象.函数调用属于方法模式,this指向调用的对象
var o = {
fn : function(){
console.log(this);
}
};
o.fn(); //o
3、构造器模式
使用new来调用函数,this指向实例化出来的对象
function Fn(){
this.n = 1;
}
var f = new Fn();
console.log(f.n); //1
需要注意的是使用new来调用函数时return返回基本类型时忽略,返回对象时函数的返回值是return的对象。
function Fn1(){
this.n = 1;
return 2;//返回基本类型
}
var f1 = new Fn1();
console.log(f1.n); //1 f1无影响
function Fn2(){
this.n = 1;
return {n:2};//返回对象
}
var f2 = new Fn2();
console.log(f2.n); //2 f2为返回的对象
4、上下文模式
使用函数.apply或者函数.cell方法调用,apply方法和call方法实现的功能相同,仅仅参数不同。apply方法第一个参数为上下文对象,第二个参数若有则为数组,内容为方法的参数列表。call第一个参数和apply相同,之后的参数为函数的参数列表
function fn(a,b){
console.log(this+"-----"+a+"------"+b);
}
var obj = {n:1};
var arr = [2];
fn.apply(obj,[1,2]); //[object Object]-----1------2
fn.call(arr,1,2); //2-----1------2