函数的概念
js函数是指一个特定的代码块,可能包含多条语句,可以通过名字来供其他语句调用以执行函数包含的代码语句。
比如我们有一个特定的功能需要三条语句实现:
statement1;
statement2;
statement3;
那么,每次想实现呢这个功能的时候就需要写这三句话很麻烦,我们可以把这三条语句打包为一个函数:
function dosth{
statement1;
statement2;
statement3;
}
这样每次想实现功能的时候,我们就调用一下函数就可以了,调用函数通过函数名称()的形式调用。
函数的命名用驼峰 动词/动宾的形式。
函数的声明
- 构造函数
函数也是对象的一种,我们可以通过其构造函数使用new来创建一个函数对象。
var sayHello=new Function("console.log('hello world');");
- 函数声明
函数声明的函数名称是可选的,比如可以有匿名函数。函数声明可以提前引用该函数。函数表达式表示的函数在末尾要加分号,就像声明其他变量一样。
一个函数名只是一个指针,就像其他对象一样。
function fn1(num1,num2){
return num1+num2
}
fn1(10,20)
var fn2=fn1;
fn2(10,20)//30
fn1=null;
fn2(10,20)//null
function wscat(type){
return type="wscat";
}
- 函数表达式
var oaoafly =function (type){
return type="oaoafly";
}
区别
- 函数声明不管在哪里定义,该函数都可以进行调用。而函数表达式的值必须是在函数表达式赋值完成后,该函数才能调用。
- 对于函数声明,js解析器会优先读取,确保在所有 代码执行前声明已经被解析。而函数表达式,如同其他基本类型的变量一样,只在执行到某一句的时候也会对其进行解析。
函数的调用
作为函数进行调用
function fn1(){}
fn1()//作为函数进行调用
作为方法进行调用
在将函数作为对象的方法进行调用的时候,该对象就变成了函数的上下文,在方法内部可以使用this进行访问。
var obj={
creep: function(){
return this;
}
}
if(obj.creep()==obj){
console.log(true);
}//证明函数里面的this指的是对象obj
作为构造器进行调用
构造器的调用是作为方法进行调用的普适方法
function Fn1(){
this.creep=function(){
return this;
}//此处的this指的是新创建的实例ninj,为的就是可以使得函数fn1通用。
}
var ninj=new Fn1()
在使用关键字new进行调用的时候,先创建了一个空的对象实例,并且作为参数this传递给该函数。又在空对象上创建了creep属性,并且把一个函数赋值给这个属性。
注意:函数和方法的命名通常是用动词,小写字母。但是构造器是用名词进行命名,以大写字母开头。
如果没有new关键字的话,this就是指向全局作用域window。因为Fn1的调用是window.Fn1。
++使用apply()和call()进行调用++
用法显式的由编码者自己决定任何一个对象作为函数的上下文。比如在事件绑定中让函数的拥有者是函数上下文而不是绑定的事件。
apply传入两个参数,一个是函数的上下文对象,一个是数组(也可以是arguments对象)
call传入的是一个参数列表,参数列表的第一项是函数的上下文对象。
计算数组项之和。
function fn1(){
var result=0;
for(i=0;i
对于apply第二个参数可以是数组也可以是arguments对象。
例如:
function fn1(num1,num2){
return num1+num2
}
fn1.apply(this,[1,2])//此处的this指的是window.
function fn2(num1,num2){
return num1+num2;
}
function sum(num1,num2){
return fn2.apply(this,arguments)//this在不明确指的情况下指的是window。此处的arguments指的是fn2的arguments.
}
sum(10,20)
匿名函数
匿名函数的应用场景:
通常是用在一个对象的方法里或者用在回调函数里(比如定时器或者事件处理程序等)
var obj={
creep:function(){}
}//应用在对象的方法里
setTimeout(function(){},200)//应用在定时器上