1、 函数声明(静态的)
function static() {}
2、 函数表达式(函数字面量)
var static = function() {}
3、 函数构造法,参数必须加引号(动态的,匿名的)
var static = new Function(‘n1’,’n2’);
1、2两者的区别:解析器会先读取函数声明,并使其在执行任何代码之前可以访问;而函数表达式则必须等到解析器执行到它所在的代码行才会真正被解释执行。
自执行函数严格来说也叫函数表达式,它主要用于创建一个新的作用域,在此作用域内声明的变量,不会和其它作用域内的变量冲突或混淆,大多是以匿名函数方式存在,且立即自动执行。
(function(n1,n2){
console.log (n1+n2)
})(1,2);//3
第3种方式从技术角度讲,这是一个函数表达式。一般不推荐用这种方法定义函数,因为这种语法会导致解析两次代码(第一次是解析常规ECMAScript代码,第二次是解析传入构造函数中的字符串),从而影响性能。
Function()构造函数每次执行时都会解析函数主体,并创建一个新的函数对象,所以当在一个循环或频繁执行的函数中调用Function()构造函数效率是非常低的。而函数字面量却不是每次遇到都会重新编译的,用Function()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。
This的指向
1、 在全局作用域下:this指window对象;
2、 在函数中的四种情况:
1、 函数声明中:this 表示全局作用域,等价于window
2、 函数表达式中(对象方法调用):指当前对象
3、 构造函数中:指向实例对象,新创建出来的对象
4、 使用bind()/apply()/call()调用:this表示传入的第一个参数
理解函数上下文
//定义一个对象
var context = {
text:”aaa”,
updown: functiotn() {
console.log(this); //打印上下文
return this.text;
}
}
//当通过这个对象来调用函数时,该对象就是此次条用上下文(context),也就是该函数的this值
context.updown();
如果函数挂载在一个对象上,作为对象的一个属性,就称他为对象的方法。当通过这个对象来调用函数时,该对象就是此次调用上下文(context),也就是该函数的this的值。
/***************************************/
基于对象: 上下文(context)> this > 挂载着变量与函数的对象
给予函数: 作用域 > 函数定义时决定的 > 作用于函数