函数
判断类型 typeof(),函数也是一种数据的类型。
函数是可以嵌套定义的,尽量不要这么嵌套函数。
三种函数的定义
function语句式
- 占用内存,但是声明一次随时可以调用
- 对于函数式的语句js会优先进行解释,调用可以在函数定义之前
function test1(){ alert("test1"); } // test1();
函数的直接变量
- 不占用内存,调用完了即销毁了,调用一次时最好使用这样的动态的方式
- 直接变量的这样的形式,只能放到函数定义之后调用,虽然也用test2进行声明了,但是没有进行赋值,只有当编译器执行到这个函数赋值的行数的时候才会进行赋值,把function赋值给test2
var test2 = function() { alert('test2'); }
构造函数式
var test3 = new Function("a" , "b","return a + b;"); alert(test3(10,20));
在js中,先会读取function语句,然后是变量的函数定义,当存在同名的函数调用的时候,会覆盖之前的函数,js中允许同名的函数存在。
作用域
构造函数式的函数,具有一个顶级的作用域
var k = 1;
function t1(){
var k =2;
var test = new Function('return k;');
}
t1(); //返回的结果是1不是2
new 一个函数的时候,相当于在全局new了一个函数,找的是全局的变量。
参数
函数的实际参数,内部是用数组来接受的,arguments.length 对象可以访问函数的实际的参数。
arguments对象一般用于递归的操作:
arguments.callee指的函数本身
this对象
- this对象是运行时基于函数的执行环境绑定的。在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。
- this关键字指代调用者
//this总指向调用者
var k =10;
function test(){
this.k = 20;
}
//window.test();this 浏览器全局的调用
//this.k = 20 是对全局的赋值
//所以全局的k将不是10,而是20
test();//当调用test的时候会执行this.k = 20;
window.test(); //因为是window调用的所以呢 ,就会把20赋值给全局的变量k