JS函数

创建函数对象

使用构造函数创建一个函数(基本不使用)
语法:var 函数名 = new Function();

var fun = new Function("console.log('1111111');");
fun();//1111111

使用函数声明创建一个函数
语法: function 函数名 ([形参1 , 形参2 , 形参3….形参n] ){语句…}

function fun2(){
    console.log("2222222");
}
fun2();//2222222

使用函数表达式创建一个函数
语法:var 函数名 = function(([形参1 , 形参2 , 形参3….形参n] ){语句…});

var fun3 = function(){
    console.log("3333333");
}   //匿名函数
fun3();//3333333

一个匿名函数加上一个括号变成立即执行函数
(函数执行完立即被调用)往往只会执行一次

(function(){
    alert("hi~");
})();//hi~

fun() - 调用函数(相当于使用函数的返回值)
fun - 函数对象(相当于直接使用函数对象)

函数的参数

可以在函数的()中来指定一个或多个形参(形式参数)
* 多个形参之间使用,隔开,声明形参就相当于在函数内部声明了对应的变量
* 但是并不赋值

调用函数时解析器不会检查实参的类型,
* 所以要注意,是否有可能会接收到非法的参数,如果有可能则需要对参数进行类型的检查
* 函数的实参可以是任意的数据类型

调用函数时,解析器也不会检查实参的数量
* 多余实参不会被赋值
* 如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined

sum(10,30);//40
sum(123,234);//357
sum(true,false);//1
sum(123,"hello");//123hello
sum(123,456,"hello",true,null);//579
sum(123);//NaN

function sum(a,b){
    //console.log("a = "+a);
    //console.log("b = "+b);
    console.log("a + b = "+(a+b));
}

函数的返回值

函数中可以使用return设置函数的返回值
1.在函数中,return后的语句不会执行

function fun(){
    alert("函数开始执行");
    for(var i=0 ; i<5 ; i++){
        if(i == 2){
            //使用return可以结束整个函数
            return;
        }
        console.log(i);
    }
    alert("函数执行结束");
}
//函数开始执行 0 1

2.如果return后不写返回值或者不写return,都会返回undifined
3.rerurn后可以跟任意类型的值(可以是一个对象,也可以是一个函数)

属性

对象的属性值可以是任意数据类型,也可以是一个函数

var per = new Object();
    per.name = "孙悟空";
    per.age = 18;
    per.say = function(){
        console.log("俺老孙来也~");
    };
    console.log(per.name);//孙悟空
    per.say();//俺老孙来也~

当一个函数作为对象的属性保存时,称这个函数是这个对象的方法
调用这个函数就是调用这个对象的方法(method)

var per2 = {
    name:"猪八戒",
    age:18,
    say:function(){
        console.log(per2.name);
    }
};
per2.say();//猪八戒

枚举对象中的属性

for…in语句
for(var 变量 in 对象){}

var obj = {
    name:"孙悟空",
    age:18,
    gender:"男",
};
for(var n in obj){
    console.log("属性名:"+n);//输出属性名
    console.log("属性值:"+obj[n]);//属性值 []中可放变量, .后面不行
}

作用域

作用域指一个变量的作用的范围

全局作用域

  • 直接编写在script标签中的JS代码,都在全局作用域
  • 全局作用域在页面打开时创建,在页面关闭时销毁
  • 在全局作用域中有一个全局对象window,它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用
var a = 10;
var b = 20;
var c = "hello";
console.log(c);//hello
console.log(window.c);//hello
  • 在全局作用域中:
    创建的变量都会作为window对象的属性保存
    创建的函数都会作为window对象的方法保存
    全局作用域中的变量都是全局变量,在页面的任意的部分都可以访问的到
function fun(){
    console.log("我是fun函数");
}
window.fun();//我是fun函数
window.alert("hello");//hello
变量的声明提前
  • 使用var关键字声明的变量,会在所有的代码执行之前被声明(但是不会赋值),但是如果声明变量时不适用var关键字,则变量不会被声明提前
console.log(a);//undifined
var a = 100;
console.log(a);//100
console.log(b);//ReferenceError: b is not defined
b = 10;
函数的声明提前
  • 使用函数声明形式创建的函数 function 函数(){}
  • 它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数
  • 使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用
fun();//hhhhhh
function fun(){
    alert("hhhhhh");
}

fun2();//TypeError: fun2 is not a function
var fun2 = function(){
    alert("hi~");
};

函数作用域

  • 调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
  • 每调用一次函数就会创建一个新的函数作用域,他们之间是互相独立的
  • 在函数作用域中可以访问到全局作用域的变量,但在全局作用域中无法访问到函数作用域的变量
  • 当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用;如果全局作用域中依然没有找到,则会报错ReferenceError
  • 在函数中要访问全局变量可以使用window对象
var a = 10;
var c = 100;
function fun(){
    var b = 20;
    var c = 30;
    console.log(a);//10
    console.log(c);//30
    console.log(window.c);//100
}
fun();//10 30 100
console.log(b);//ReferenceError: b is not defined

在函数中,不使用var生命的变量都会成为全局变量

var c = 10;
function fun3(){
    c = 33;//相当于window.c = 33;
}
fun3();
console.log(c);//33

函数声明也会在函数中所有的代码执行之前执行

function fun4(){
    fun5();
    function fun5(){
        alert("hiii");
    }
}
fun4();//hiii

定义形参就相当于在函数作用域中声明了变量

var e = 23;
function fun6(e){
    alert(e);//undifined
}
fun6();

函数对象的方法

call()和apply()

-这两个方法都是函数对象的方法,需要通过函数对象来调用
当对函数调用call()和apply()时,都会调用函数并执行

function fun() {
    alert("hello");
}
fun.call();//hello
fun.apply();//hello
fun();//hello

在调用call()和apply()可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this

function fun(){
    console.log(this.name);
}
var obj = {
    name:"obj",
    sayName:function(){
        console.log(this.name);
    }
};
var obj2 = {
    name:"obj2"
};
fun.call(obj);//obj
fun.call(obj2);//obj2
obj.sayName();//obj
obj.sayName.call(obj2);//obj2
/*
fun.apply(obj);//obj
fun.apply(obj2);//obj2
obj.sayName();//obj
obj.sayName.apply(obj2);//obj2
*/
  • call()方法可以将实参在对象之后依次传递fun.call(obj,2,3);
  • apply()方法需要将实参封装到一个数组中统一传递fun.apply(abj,[2,3]);
function fun2(a , b){
    console.log("a = "+a);
    console.log("b = "+b);
    console.log("a + b = " +(a+b));
}
fun2.call(obj , 2 ,3);
fun2.apply(obj , [2 ,3]);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值