函数
函数也是一个对象;类型是function;韩式就是封装了一段可以被重复执行调用的代码块;
目的:就是让大量代码重复使用。
封装到函数的代码不会立即执行,调用的时候才会执行;
调用的语法:函数对象();
fun();
创建一个函数
- 利用构造函数(少用)
var fun = new Function("console.log('hello');");
-
使用函数声明来创建一个函数
语法: function 函数名 ( [ 形参1,形参2...形参n ] ){ 语句... } 举例: function fun2() { console.log("hello"); } fun2(); -
使用函数声明来创建一个函数
var 函数名= function( [ 形参1,形参2...形参n ] ){ 语句... } 举例: var fun3 = function () { console.log("你好"); };//赋值语句 fun3();
函数的参数
定义一个用来求两个数和的函数
function sum(a, b) {//相当于函数里面有 var a; var b;
console.log(a + b);
}
sum(2, 4);
- 多个形参之间用逗号隔开,声明形参就相当于在函数内部声明了对应过的变量,但是并不赋值;
- 调用函数的时候,可以在()内指定实参;
- 实参将会赋值给函数中对应的形参;
- 调用函数时解析器不会检查实参的类型和数量,多余的实参参不会被赋值,少的话没有对应的实参的形参,返回结果是undefined;
函数的返回值
可以用return 来设置函数得到返回值
语法: return 值
return后的值将会作为函数的执行结果返回,可以定义一个变量来接受该结果;
// 创建一个函数——3个数求和
function sum(a, b, c) {
var d = a + b + c;
return d; //return 后的语句不会执行;
alert("hello");// 不会执行
}
// 调用函数
// 变量result的值就是函数的执行结果
var result = sum(1, 2, 3);
-
return 后面的语句不会执行;
-
return 后面没有返回值,结果就是undefined;
-
函数中没有return ,结果也是undefined;
//判断一个数是否为偶数,是true,不是false function tt(num) { if (num % 2 == 0) { return true; } else { return false; } } // 改写: function tt(num) { return num % 2 == 0;//这个式子本身就是逻辑判断,结果就是逻辑值; } var result = tt(15); console.log("答案就是:" + result); -
参数较多的时候,可以把实参封装成一个对象,通过对象进行传递;
function user(o) { console.log("我的名字叫做" + o.name + "我今年" + o.age + "岁了" + "性别" + o.gender); } var obj = { name: "lahuan", age: 18, gender: "女", address: 1233442 }; user(obj); -
实参为函数:
function fun(a) { console.log(a); //ƒ () { alert("hello") } //a(); // 弹框"hello" } fun(function () { alert("hello") });
注意区别:
- fun(fun2())
调用函数,相当于使用函数fun2的返回值 - fun(fun2)
函数对象,相当于直接使用函数对象fun2
注意return、continue、break的区别:
function fun() {
alert("123");
for (var i = 0; i < 5; i++) {
console.log(i);
if(i==2){
return;
// return直接结束函数,break直接结束for循环,continue继续i=3的for循环
}
}
alert("456");//return 这条不执行,continue和break这条执行
}
fun(); // "123",0,1
返回值可以是对象也可以是函数
函数里面套函数
function fun3() {
// 在函数内部再声明一个函数
function fun4() {
console.log("hello");
}
fun4();
}
fun3();
function fun3() {
function fun4() {
console.log("hello");
}
return fun4; //fun4函数对象作为函数的返回值返回
return fun4();// hello undefined, fun4没有返回值
}
a = fun3();
console.log(a);
立即执行函数
函数定义完,立即执行,这种函数叫做立即执行函数,
立即执行函数往往只执行一次
//若没有外层的小括号,就会报错,因为函数的名字没有,也灭有赋值给一个变量,参考前面函数的两种常用写法
(function () {
alert("我是一个匿名函数");
})();
(function (a,b) {
console.log(a+b);
})(12,34);
函数也可以作为对象的属性——方法
var obj = {
name: "孙悟空",
age: 18,
fun: function () {
console.log(obj.name);
}
}
obj.fun(); // 调用方法,返回值"孙悟空"
如果一个函数作为一个对象的属性保存,那么我们称这个函数就是对象的方法,只是名称的区别;
document.write(); console.log();这些都是方法
作用域
作用域指一个变量的作用范围
全局作用域
- 直接编写再script标签中的JS代码,都在全局作用域;
- 全局作用域再页面打开时创建,再页面关闭时销毁;
- 在全局作用域中有一个全局对象window(代表一个浏览器窗口),我们可以直接使用;
- 在全局作用域中,创建的变量都会作为window对象的属性保存;
- 在全局作用域中,创建的函数都会作为window对象的方法保存;
变量的声明提前
console.log(a);
var a = 12; //undefined
// 相当于
var a;
console.log(a);
a=12;
//若没有var,则不会提前声明
-
使用函数声明形式的函数 function(){} 会在所有代码执行之前被创建
-
使用函数表达式创建函数,不会被提前创建
fun();//执行成功 fun2();//报错 function fun() { console.log("我是函数1"); } var fun2 = function () { console.log("我是函数2"); }
函数作用域
-
调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁;
-
每调用一次函数就会创建一个新的函数作用域,他们之间互相独立;
-
函数作用域中可以访问到全局作用域的变量,反之不行;
-
函数中的变量先在自己的函数作用域中找,若没有找上一级找,若全局作用域中也没有,则会报错(就近原则);
-
在函数中要想访问全局变量,就用window对象;
-
在函数作用域中,使用var关键字声明的变量,也有变量声明提前的特性;
-
在函数中没有用var声明的变量就是全局变量;
// 案例1: var c = 33; function fun() { console.log(c); //找上一级 c = 10;//相当于 window.c } fun(); console.log(c);//10 // 案例2 var c = 33; function fun() { console.log(c); //undefined var c = 10; } fun(); console.log(c);//33
枚举对象中的属性
使用 for ... in 语句
语法格式:
for (var 变量 in 对象){
}
var obj = {
name: "lahuan",
age: 18,
gender: "女",
address: 1233442
};
for (var n in obj) {
console.log(n); //返回对象中所有的属性名
console.log(obj[n]); //中括号可以取变量 返回属性值
}