函数的声明
javascript函数实际上是一个对象,每个函数都是Function类型的实例,和其他引用类型一样都具有属性和方法,由于函数时对象,因此函数名是一个指向函数对象的指针,不会与某个函数绑定
– 函数的声明
function 函数名(){
函数体
}
- 函数表达式
var box = function(){};
var box = new FunctionI();
第二中声明方法不建议使用,会导致解析两次代码
- 函数没有重载,后写的函数会把现写的覆盖掉。
- 在Javascript中函数名本身就是变量,也就是说可以像传递参数那样吧一个函数赋值给另一个函数,而且可以将一个函数作为另一个函数的结果返回。
//将一个函数作为参数传递给另一个函数
function add(num1 , num2){
return num1 + num2;
}
function raise(add , num1 , num2){
return add(num1 , num2)+1;
}
alert(raise(add, 10 , 10));//21
- 使用js内置函数Function创建函数
- 使用这种方式创建函数也成为动态函数
- 格式:var a = new Function(“参数列表”,”方法体和 返回值”)
// 函数定义的第三种方式,使用js内置对象创建函数,这宗函数也成为动态函数,但是不常用
var add = new Function("a,b","var sum;sum = a + b;return sum");
alert(add(3,3));
return 返回值
-
任何函数都是不带返回值的,只有当你调用的时候,才会返回返回值。
-
return 的另一个作用,退出当前语句、
匿名函数
- 格式:
//匿名函数的写法
function(){//省略函数名
//方法体
}
- 上面的匿名函数不能自我调用
- 把匿名函数赋值给一个变量,相当于给对象内部创建对象一样
var c = function(){
方法体
}; //创建函数不需要加分号,但是这里是赋值给一个变量,是一条语句,所以要加分号
-
匿名函数的自我调用:
- 格式: ()(); 两个小括号
- 第一个小括号写匿名函数
- 第二个小括号写参数列表
- 结尾要加分号也可以不加,但是建议加
不传入参数的情况
(function(){
alert("匿名函数的自我执行");
})();
传入参数的情况
var a = (function(age){
return age;
})(100);
alert(a);
- 函数里放一个匿名函数
function a(){
return function(){
return "内部匿名函数执行了";
};
}
alert(a()());
闭包
- 全局变量虽然容易访问,但是正是容易访问会让他变得很危险
- 使用内部变量的话,又会面临每次调用内部都会初始化的问题
- 闭包解决了这个问题
- 通过闭包实现内存驻留,可以方法这个局部变量
//这就是闭包,通过闭包实现内存驻留,同时有不会像全局变量那样
//放在外边很危险
function a(){
var count = 100;
return function(){
count++;
return count;
};
}
var b = a(); //将函数a的引用赋值给b
alert(b());//101
alert(b());//102
alert(b());//103
alert(b());//104
==代码分析==
– 上面代码的a函数结果返回给b,这个时候由于他的放回值还在使用变量count,那么就实现了,虽然函数执行了,但是函数内变量没有回收,这样就是内存驻留
– 并且,由于是局部变量,所以外部不能访问,实现了安全的效果
– 继续调用返回的函数,就可以安全的实现累加运算
==注意;==
– javascript 中所有的属性和方法都是公有的,但是可以定义私有变量和私有函数
arguments 对象
javascript函数不会因为 传入的函数参数不一致而报错,可以在函数内部通过arguments对象来获得传入的参数
<script type = "text/javascript">
var a = box(1,3,5,2,3);
console.log(a);//控制台输出
function box(){
//计算传入数据之和
var sum = 0;
for(var i = 0;i <arguments.length; i++){
sum += arguments[i];
}
return sum;
}
</script>
所有函数都包含的方法
- call() 使用当前的函数调用另一个函数
- apply() 功能和call相同只是传入的参数是个数组
- 是当前的函数调用另一个函数,
- 使用函数的call() apply() 替换当前的方法,
- 格式:要替换的方法名 . call(被替换的方法,参数列表)
//定义一个add 方法
function add(x, y) {
return x + y;
}
//用call 来调用 add 方法
function myAddCall(x, y) {
//调用 add 方法 的 call 方法
return add.call(this, x, y);
}
//apply 来调用 add 方法
function myAddApply(x, y) {
//调用 add 方法 的 applly 方法
return add.apply(this, [x, y]);
}
console.log(myAddCall(10, 20)); //输出结果30
console.log(myAddApply(20, 20)); //输出结果40
-
改变作用域
- 因为这个方法是函数的,所以必须线创建一个有返回值来接受返回值的函数
- 创建各种情况的变量,全局变量,局部变量,类的属性
- 调用函数来访问不同的作用域的变量,
- 使用call() 方法匹配要访问的区域,这个值是付给了函数中的this
var name = '小白';
var obj = {name:'小红'};
function sayName() {
return this.name;
}
console.log(sayName.call(this)); //输出小白
console.log(sayName. call(obj)); //输入小红
-
call()和apply()区别
- 参数不同, apply 传入的是一个参数数组,也就是将多个参数组合成一个参数数组, call 从第二个参数开始依次传入.
- apply 可以直接将当前函数的arguments对象作为apply的第二个参数传入
js全局函数
- 全局函数不属于特定的任何有一个对象
- 可以直接写函数名使用
-
常用的方法 :
- eval()执行其中的javascript中的代码
- isNaN()判断参数是不是一个==非数字==
-
parseInt()解析一个字符串并且 返回一个整数
版权声明:本文为diaosinixiheixiu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。