JavaScript引用类型Function实例详解

Function类型前端

函数是对象,函数名是指针:每一个函数都是Function类型的实例。因为函数是对象,所以函数名是一个指向函数对象的指针,不会与某个函数绑定,一个函数可能会有多个名字。express

function getSum(a, b) {
  return a + b;
}//前端全栈学习交流圈“866109386
alert(getSum(2, 3));//5
var copy = getSum;
alert(copy(2, 3));//5
getSum = null;
alert(copy(2, 3));//5

定义函数的方式有三种:函数声明、函数表达式、Function构造函数。数组

Function构造函数接收任意数量的参数,前面的参数枚举了函数的参数,最后一个参数是函数体。通常不推荐使用Function构造函数定义函数。浏览器

var getSum = new Function("a", "b", "return a + b";

JavaScript没有函数重载的概念,若声明了两个同名函数,则后面的函数会覆盖前面的函数。函数

因为函数名自己是变量,所以函数也能够做为值来使用,不只能够传递一个函数做为参数,还能够将函数做为返回值。学习

function callFunction(func, arguments) {
  return func(arguments);
}//前端全栈学习交流圈:866109386
function sayHello(name) {
  return "Hello, " + name;
}
var result = callFunction(sayHello, "Alice");
alert(result);//Hello, Alice

①、函数声明指针

function 函数名称(参数|可选) { 函数体 }code

例:对象

function func1(){// 声明,程序的一部分
  function func() {// 声明,函数体的一部分
    ...//函数体
  }
}

②、函数表达式递归

function 函数名称|可选(参数|可选) { 函数体 }

例1:

var fun = function func() {};//表达式,赋值表达式的一部分

例2:

new function func(){};//表达式,new表达式

例3:

(function func(){});
//表达式,包含在分组操做符——括号()内,括号()内只能包含表达式

例4:

[function func() {}];//表达式,数组初始化器内只能是表达式

例5:

1, function func() {};//表达式,逗号只能操做表达式

③、函数构造器

函数构造器建立的函数的[[Scope]]属性仅包含全局对象。

<script>
  var a = 1;
  func1();
  function func1() {
    var a = 2;
    var b = 3;
    var func2 = new Function("alert(a); alert(b);");
    func2();//1,b is not defined
  }
</script>

函数构造器建立的函数func2能够从全局对象中取得变量a,但全局对象中没有b,所以报错:b未定义。

函数声明和函数表达式的区别

1)函数声明在进入上下文阶段建立,在代码执行阶段就已经可用了,函数表达式则是在代码执行阶段才建立,因此函数声明能够提高,但函数表达式则不能。

函数声明提高:

func();//报错:func is not a function
var func = function (){
  alert("Function expression");
}

2)函数声明影响变量对象VO,也就是存储在上下文的VO中的变量对象,函数表达式不影响变量对象VO,不存在于变量对象中,这意味着既不可能经过名称在函数声明以前调用它,也不可能在声明以后调用它。可是,函数表达式在递归调用中能够经过名称调用自身。 例1:

alert(func); //报错:func is not a function。定义以前不可用,由于它在代码执行阶段建立
(function func() {});
alert(func); //报错:func is not a function。定义以后也不可用,由于它不在变量对象

例2:

(function func(param) {
  if (param) {
    return;
  }
  func(true);//func可用,递归调用能够经过名称调用自身
})();
func(); // func is not a function,外部不可用

3)函数声明只能出如今程序或函数体内,不能出如今表达式或块({ … })中,如if、while或for语句中。由于JavaScript无块级做用域,只有函数和全局做用域。 函数表达式出如今表达式的位置。

函数声明:有的浏览器会返回if,而有的浏览器会返回else。

if (true) {
  function func() {
    alert('if');
  }
}
else {
  function func() {
    alert('else');
  }
}
func();

函数表达式:全部浏览器都返回if。

var func;
if (true) {
  func = function() {
    alert('if');
  };
}
else {
  func = function() {
    alert('else');
  };
}
func();
相关文章
相关标签/搜索