JavaScript 函数

JavaScript 函数

函数概念

函数是一块 JavaScript代码,被定义一次,但可执行和调用多次。JS中的函数也是对象,所以JS函数可以像其它对象那样操作和传递,所以我们也常叫JS中的函数为函数对象。

image-20191009222228763

函数创建方法

  • 函数声明

    function func(){
      //do something
    }
  • 函数表达式

    var func = function(){} //传入匿名函数
  • 使用构造函数

    var func = new Function('参数1','参数2','函数内部块');
    //等价于
    var func = Function() ; 

不同创建方法,会有不同差别

image-20191009230317799

//函数声明与函数表达式进行对比
var result = add(1,2) ;
console.log(result) //输出3
function add(a,b){
  return a+b
}

//等价于
function add(a,b){
  return a+b
}
var result = add(1,2) ;
console.log(result) //输出3

使用函数声明,可以进行函数提升,执行上下文之前,函数声明会提升到前面,可以直接进行调用

var result = add(1,2)
console.log(result) //报错,Uncaught TypeError: add is not a function

var add = function(a,b){
  return a+b
}

//等价于
var add; //此时add刚刚被定义,值为undefined
var result = add(1,2);
console.log(result) 
add = function(a,b){
  return a+b
}

使用函数表达式创建函数,仅仅会把当前的变量进行提升,并不能对内部的匿名函数进行提升。

var result = add(1,2)
console.log(result) //报错,Uncaught TypeError: add is not a function
var add = new Function('a','b','return a+b');

//示例
var globalTime = 3;
(function(){
  var time = 2;
  var getTime = Function('return time') //undefined,无法访问到函数内部变量,却可以访问到全局变量(globalTime)
})

使用函数构造器构造函数时,函数也不会进行提升,不能访问到函数内部变量,可以访问全局变量。

函数属性与arguments

function foo(x,y,z){
  arguments.length //实际传入两个形参 那么长度就是2
  arguments[0] //返回1
  arguments[0]=10 
  x //打印为10 (严格模式下赋值会失败)
  arguments[2] = 20 
  z //打印为20
  arguments.callee === foo //arguments下的callee属性指向函数本身(严格模式下不能使用)
}

foo(1,2)
foo.length // 函数的形参3个,所以长度为3
foo.name //名称foo

闭包

在函数作用域外,仍然能通过一种形式访问到函数内部的局部变量。

function caller(){
  var abc = 111;
  return abc
}
caller() ; // 111 此时只有调用函数的时候才能获取到abc的值

function caller(){
  var abc = 111; 
  return function(){
      return abc;  
  }
}
var func = caller();
func(); //可以获取到内部变量abc

闭包可以进行封装,灵活方便。但是容易造成空间浪费,内存泄漏,性能消耗等问题。

作用域

  • 全局变量

    var i = 0;
    function func(){
      console.log(i)
    }
    func(); // 0
    
    for(var j = 1 ; j<6;j++){
    
    }
    console.log(j) // 1
  • 局部变量

    function foo(){
      var i = 0;
    }
    console.log(i) //undefined
    
    //特殊例子
    function foo1(){
      var i = 0 ;
      var foo2 = new Function('console.log(i)');
      foo2()
    }
    foo1() ; // undefined
    
  • eval() 内部声明的变量

利用函数作用域封装

(function(){

})()
//or
!function(){

}() //变成函数表达式

评论