函数是一个可以重复使用的代码块,函数可以实现代码的复用
- 函数类型(function)---function(){}
一、 声明函数
函数声明不会执行,只有到调用时候才会执行,不调用,不执行
1、使用var
语法:var 函数名=function () {代码块}
var fun=function(){
console.log(1)
}
2、使用function
语法:function 函数名(){代码块}
只有function声明的的函数才可以在声明之前上面调用
function fun(){
console.log(1)
}
二、调用函数
函数调用几次就执行几次,
语法:函数名()
只有function声明的的函数才可以在声明之前上面调用
function fun(){
console.log(1)
}
fun()//调用函数
fun()
function fun(){
console.log(1)
}
三、函数的作用域
函数的花括号是一个单独的作用域,在内部声明的变量在外部无法使用
function fun(){
var a=10
// console.log(a);//正确
}
console.log(a);//报错
四、匿名函数
匿名函数:没有名字的函数
优点:可以保护原来的代码不被污染,方便写库
function (){
}
~(function (){
})
五、自执行函数
自己调用自己执行出来
~(function (){
console. log(1);
})()
六、函数的封装
将重复的代码(逻辑/功能)才分出来放到一个函数中,方便复用,其他地方使用这个功能直接调用这个函数
function fun() {
var str=0
for (var i = 1; i < 101; i++) {
str+=i
}
console.log(str);
}
fun(50)
七、函数的参数
- 实参:函数调用时写在函数小括号中的数值
- 形参:就是函数声明时函数名小括号中的变量
function name(a){//形参
console.log(a);
}
name(3)//实参
1、函数的传参
- 当形参多于实参时,先是一─对应,多余的形参赋值为undefined
function name(a){
console.log(a);//
console.log(b); //
console.log(c);
}
name(3,2,1)
- ·当实参多余形参时,先是一一对应,多余的实参会被舍弃
function name(a){
console.log(a);//
console.log(b); //
console.log(c);
}
name(3,2,1)
2、arguments
- arguments--可以获取到所有的实参
是一个伪数组,有长度、有下标,可以通过下标获取到里面的具体的数据,也可以获取到传递的实参的数量
function name(){
console.log(arguments);
}
name(1,2,3,5,5,6,8,9,1,32,42,534,634,6,45,57,56,75,68,8)
8.函数的返回值
使用return:将你需要在外部使用的变量或者方法就可以使用return返回给函数本身 在外部打印函数名就可以使用。return有阻断作用
function name(){
var a=10
return a
}
console.log(name());
字符串去重
var str = '123123'
var a = ''
for (var i = 0; i < str.length; i++) {
//从第二个下标值判断
for (var j = i+1; j < str.length; j++) {
if(str[i]===str[j]){
a+=str[i]
}
}
}
console.log(a);
使用函数返回值
function fun(str) {
var a = ''
for (var i = 0; i < str.length; i++) {
for (var j = i + 1; j < str.length; j++) {
if (str[i] === str[j]) {
a += str[i]
}
}
}
return a
}
var b = '123123'
fun(b)//把b传进fun函数中
九、内置函数--九个
Funtion ()//函数
Number ()//数值
string ()//字符串
Array ()//数组
Object ()//对象
Boolean ()//布尔
Error()//错误
Date ()//时间
RegExp ()//正则
十、函数提升
使用var声明的函数会将函数名提升到当前作用域的最顶端,只声明,没有定义函数,所以调用时会出错,当只有函数时,会使整个函数都提升到作用域最顶端,可以调用
//报错
//使用var声明的函数会将函数名提升到当前作用域的最顶端,只声明,没有定义函数,所以调用时会出错
name()
var name = function () {
console.log(1);
}
//可调用
//当只有函数时,会使整个函数都提升到作用域最顶端
fun()
function fun() {
console.log(1);
}
变量提升,会以函数提升优先
function a() {console.log(1);}
var a =undefined
console.log(a); / /undefined
var a = 10
function a(){console.log(1);}
console.log(a);//10
a()//报错
十一、构造函数
构造函数会经历以下 5 个步骤:
- 创建一个空对象,作为将要返回的对象实例。
- 将这个空对象的原型,指向构造函数的prototype属性(prototype是一个显示属性,他身上存储的是公有的属性)。
- 将这个空对象赋值给函数内部的this关键字。(this的指向就是创建的实例)
- 执行构造函数内部的代码。
// 构造函数
function Person(name, age) {
this.name = name;
this.age = age
}
var obj=new Person('张三',18)
console.log(obj);
new的作用:
实例化一个对象
- 开辟一个新的内存空间,{}
- this指向这个新的对象,(this指向实例对象)
- 给这个新的对象添加属性和方法
- 返回这个对象
// 开头首字母大写,使用this指向属性
// 创建
// 有参构造
function Person(name, age) {
this.name = name;
this.age = age
}
// 调用
var obj=new Person('炸',543)
var obj1=new Person('123',543)
console.log(obj);
console.log(obj instanceof Person);//true
- 不需要return来返回,
- 当使用工厂函数创建实例时,他的实例和他的对象返回的Boolean数据类型为true。
- 当他改变一个数组时,不会影响原有数组
- 返回新对象