目录
函数:
函数中可以封装一些功能(代码),在需要时可以调用这些功能(代码),封装到函数中的代码不会立即执行,会在函数调用的时候执行。调用函数时,函数中封装的代码按顺序执行
var fun=new Function("console.log('hello world!');"); //创建一个函数对象,并将要封装的代码以字符串的形式传递给构造函数(此方法基本不用)
//fun(); 调用函数:函数对象(),执行结果:hello world!
fun.hello="你好";
console.log(fun.hello); //执行结果:你好,函数对象具有对象的一切功能且更强大
使用函数声明创建一个函数:function 函数名(形参1,形参2,... ...){语句},形参也可以不写,即此函数不传递参数,在{ }中写要封装的代码,形参相当于函数内部声明的变量
function sum(a,b){
console.log(a+b);
}
sum(3+4+5); //运行结果:7,解析器不检查实参的数量,多余实参不被赋值,如果实参的数量小于形参,则没有对应实参的形参将是undefined。也不会检查数据类型,所以要注意是否有可能接收到非法参数
使用函数表达式创建一个函数:var 函数名=function(形参1,形参2,... ...){语句}
var fun=function(){ //将匿名函数的对象赋值给fun变量
console.log("我是匿名函数中封装的代码");
}; //因为是赋值语句所以写分号
fun(); //调用函数
函数的返回值:
function sum(a,b,c){
var d=a+b+c;
return d; //函数只执行到return语句就返回,return后的语句不会被执行
}
var result=sum(3,4,5);
如果函数中不写return语句或return或只写一个return;,则返回的值为undefined
实参可以是任意的数据类型,也可以是一个对象或函数,当参数过多时,可以将参数封装到一个对象中
function hello(name,age,gender,address){
console.log("我是"+name+",性别"+gender+",今年"+age+"岁,住在"+address);
}
hello("张三",18,"男","成都");
或
function hello(obj){
console.log("我是"+obj.name+",性别"+obj.gender+",今年"+obj.age+"岁,住在"+obj.address);
}
var obj={
name:"张三",
age:18,
gender:"男",
address:"成都"
};
fun();调用函数,相当于使用函数的返回值;fun函数对象,相当于直接使用函数对象
立即执行函数:函数定义完,立即被调用,往往只能执行一次
( function(){
alert("我是一个匿名函数");
} ) ();
匿名函数也可以传参:
( function(a,b){
console.log(a);
console.log(b);
} ) (23,34); 执行结果:23 34
方法:
如果一个函数作为对象的属性保存,就称这个函数是这个对象的方法,调用函数就说调用对象的方法(method),但它只是名称上有区别
调用方法:
console.log(a); //调用console的log方法
调用函数:
fun();
枚举对象的属性:
使用for...in语句:for(var 变量 in 对象){ },对象中有几个属性,循环体就会执行几次,每次执行时,会将对象中的一个属性的名字赋值给变量
for(var n in console){
console.log("属性名"+n);
console.log("属性值"+console[n]); //输出每个属性的值
}
作用域(scope):
在JS中,有全局作用域和函数作用域,直接编写在script标签中的代码都在全局作用域,在页面打开时创建,页面关闭时销毁,在全局作用域中有一个全局对象window,它代表的是一个浏览器的窗口,由浏览器创建,我们可以直接使用。在全局作用域中,创建的变量都会作为window对象的属性保存,创建的函数都会作为window对象的方法保存
变量的声明提前:使用var关键字声明的变量,会在所有代码执行之前被声明(但是不会赋值),但是如果声明变量时不使用var关键字,则变量不会被声明提前
函数的声明提前:使用函数声明形式创建的函数(function函数名(){ })会在所有代码执行之前就被创建,所以我们可以在函数声明前调用函数,使用函数表达式创建的函数(var 函数名=function(){ }),不会被声明提前,所以不能在声明前调用
函数作用域:调用函数时创建,函数执行完毕后销毁。每创建一次函数就会创建一个新的函数作用域,他们之间相互独立。在函数作用域中可以访问到全局作用域的变量,在全局作用域中无法访问到函数作用域的变量。当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接用,如果没有则向上一级作用域中寻找,直到找到全局作用域,如果全局作用域中依然没有找到,则会报错。在函数中要使用全局变量可以使用window对象(window.a)
在函数作用域中也有声明提前的特性,使用var关键字声明的变量和函数声明会在函数中所有的代码执行之前被声明。在函数中,不使用var声明的变量都会成为全局变量
var a=123;
function fun(){
alert(a);
}
fun(); //输出:123
//————————————
var a=123;
function fun(){
alert(a);
var a=456;
}
fun(); //输出undefined
alert(a); //输出123
//————————————
var a=123;
function fun(){
alert(a);
a=456; //局部没有a,找全局
}
fun(); //输出123
alert(a); //输出456
//————————————
var a=123;
function fun(a){
alert(a);
a=456; //函数内定义了形参,改变的是函数内a的值
}
fun(); //输出undefined
alert(a); //输出123
//————————————
var a=123;
function fun(a){
alert(a);
a=456;
}
fun(123); //输出123
alert(a); //输出123
(作者观看的学习视频:B站尚硅谷)