首页 > 代码库 > js函数
js函数
1.函数简介
-Function类型,即函数的类型
-一个典型的JavaScript函数定义如下:
function 函数名称(参数表) {
函数执行部分;
}
注意函数的参数表直接写形参名,不用写var类型。
-return语句,return返回函数的返回值并结束函数运行
-函数也可以看做数据来进行传递
<script type="text/javascript" charset="UTF-8"> function test(a, b) { return a + b; } alert(test(10, 20)); // 函数也是一种数据类型 alert(typeOf test); // 返回值为function // 函数可以传递 function test1(func) { func(); } function test2() { alert(‘aaa‘); } test1(test2); // 函数可以嵌套 function test4() { function test5() { alert(‘inner‘); } //只能在函数内部调用,外部不可调用 test5(); } test4(); </script>
2.函数的三种定义方式
-三种定义方式
- function语句式
-函数直接量式
-通过Function构造函数形式定义函数
-比较三种方式定义的区别
function语句 function构造函数 函数直接量
兼容 完全 js1.1以上 js1.2以上
形式 句子 表达式 表达式
名称 有名 匿名 匿名
性质 静态 静态 静态
解析时机 优先解析 顺序解析 顺序解析
作用域 具有函数作用域 顶级函数(顶级作用域) 具有函数作用域
<script type="text/javascript" charset="utf-8" defer="defer" src="http://www.mamicode.com/commons/001.js"> // 3种方式定义函数 // 1 function语句函数式 function test1() { // 只会被编译一次,放到内存里,静态,效率高 alert(‘我是test1‘); } // 2.函数的直接量式 ECMAScript推荐使用 // 只会被编译一次,放到内存里,静态,效率高 var test2 = function() { alert(‘我是test2‘); }; // 3.function 构造函数式 // 每次都会被编译,效率低,但不占用内存 var test3 = new Function("a", "b", "return a+ b;"); alert(test3(10,20)); function test1() { alert(‘111‘); } test1(); var test2 = function() { alert(‘222‘); }; test2(); // 执行结果为111 -》222 没问题 // 但是如果将test1和test2分别放到函数体之前执行呢, test3(); function test3() { alert(‘333‘); } test3(); alert(test4); //返回undifind,表示变量声明了,但是没有赋值 test4(); var test4 = function() { alert(‘444‘); }; // 执行结果为333 ,为什么444没有被弹出,因为只有function语句函数式才是优先解析,剩下是顺序解析 // 作用域问题 var k = 1; function t1() { var k = 2; function test() {return k;} // 2 var test = function(){return k;};// 2 var test = new Function("return k;"); // 1 原因是具有顶级作用域,相当于在外面(全局)new 了一个函数,所以结果为1 alert(test()); } t1(); </script>
3.函数的参数(arguments对象)
-arguments是表示函数的实际参数(与形参无关)
-callee函数(回调函数属性)
-arguments对象的秘密属性 callee属性。这个属性比较奇怪,它能够返回arguments对象所属的函数的引用、这相当于
在自己的内部调用自己。用法:检测函数传递的参数正确与否。
<script type="text/javascript" charset="utf-8"> // js中 函数的参数分为:形参和实参 function test(a, b, c, d) { // 形参4个 实参2个,在js中 形参个数和实参个数没有关系 // 如何求形参的个数 test.length; // 函数的实际参数,内部就是用一个数组去接受的 // arguments对象 可以访问函数的实际参数 // arguments对象 只能在函数的内部访问和使用 alert(arguments.length); alert(arguments[0]); alert(arguments[1]); if (test.length === arguments.length) { return a + b; } else { return ‘参数不正确‘; } } alert(test(10, 20)); // arguments对象 用的最多的地方还是做递归操作 // callee方法 指向的是函数本身 arguments.callee.length;// 等价于test.length function fact(num) { if (num <= 1) { return 1; } else { // 这里建议使用arguments.callee,因为可以存在这样的代码,fact = null,这样会出现问题 return num * arguments.callee(num - 1); } } alert(fact(5)); </script>
4.this对象
-this对象是在运行时基于函数的执行环境绑定的。在全局函数中,this等于window,而当函数被作为某个对象
的方法调用时,this等于那个对象。
-也就是说this关键字总是指代调用者。
<script type="text/javascript" charset="utf-8"> // this : this对象是指在运行时期,基于执行环境所绑定的。 // 总是指向调用者 var k = 10; function test() { this.k = 20; } alert(test.k); // 返回undefind,因为函数只是编译了,并没有执行 test(); // 对于test来讲,执行环境是全局作用域 等价于window.test(); alert(test.k);// 还是返回undefined,因为this指的是window alert(window.k); // 20 等价于alert(k); </script>
js函数