实例成员与静态成员
实例成员:由构造函数创建的对象的成员。
静态成员:构造函数的成员
一般在使用的时候, 将通用的方法由静态成员提供, 实例成员如果要实现该功能, 调用静态成员来实现
构造函数的部分属性
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