函数学习笔记

函数的定义:
函数是一段能够反复调用的代码块,函数能够接受输入的参数,不一样的参数返回值也不一样
通俗的说函数就是一个工具,用来实现某个功能,具备封装性javascript

函数的声明有两种方式:
第一种声明方法: function命令
function fn () {
}java

第二种声明方式:函数表达式
须要注意的是,函数表达式声明函数,表达式后面须要加上分号,表示语句结束
var fn = function () {
};函数

注意:
第二种声明方式,function后面不带有函数名,若是加上函数名,该函数名只在函数内部有效,函数外部无效
var print=function x(){
  console.log(typeof x);
};
print(); //function
x(); //报错
这种写法的用处有两个,一是能够在函数体内部调用自身,二是方便除错(除错工具显示函数调用栈时,将显示函数名,而再也不显示这里是一个匿名函数)。工具


函数不得在条件语句中声明函数
javascript规定不能够在非函数代码块中声明函数,好比在if语句,try语句中声明函数
if(false){
  function ff(){}
}spa

因为函数提高,致使上面的if语句无效递归

若是要实如今条件语句中声明函数的目的,必须使用函数表达式声明法ip

if(false){
  var ff1=function(){作用域

  }字符串

}源码

ff1(); //报错


函数名的提高:
javascript把函数名视同为变量名,在预解析的时候会把整个函数提高到代码头部,因此function命令声明的函数,能够先调用后声明

fn(); //不会报错
function fn(){
  console.log(1);
}

可是函数表达式声明的函数却不能够,由于js预解析的时候只是把变量声明提到了代码的最顶部,并无把赋值提高,在没有赋值以前,变量的值为undefined
fn1(); //报错 fn1不是一个函数
console.log(typeof fn1); // undefined
var fn1=function(){
  console.log(2);
}


注意:同时采用赋值语句和function命令声明同一个函数,最后老是采用赋值语句声明的函数


递归函数:
函数的内部能够调用自身,这就是递归函数

function fib(num){
  if(num===0){
    return 0;
  }
  if(num===1){
    return 1;
  }
  return fib(num-2)+fib(num-1);
}

函数中的return语句
函数体内部的return语句,表示返回。javascript引擎遇到return语句,就返回return后面的那个表达式的值,后面即便还有语句,也不会获得执行,也就是说return语句后面的那个表达式值就是函数的返回值,return语句不是必须的,若是不写,函数就不返回任何值,或者返回undeifned

函数的属性和方法:
1.函数的length属性返回的是函数预期返回的参数的个数,也就是函数声明时候参数的个数

function fn(a,b){
  return a+b;
}

console.log(fn.length);

fn(1);
console.log(fn.length);

fn(1,2,3);
console.log(fn.length);

2.name属性返回的是紧跟在function关键字后面的那个函数名
function f1(){

}

console.log(f1.name); //f1

//将一个匿名函数赋值给一个变量
var f2 = function () {};
//那个这个函数的name属性值在ES5下老是返回一个空字符串
console.log(f2.name); //""

//在ES6下作了修改,返回的是实际的函数名
console.log(f2.name); //f2

//真正的函数名仍是f3,myName这个名字只在函数体内部可用
var f3=function myName(){

}

console.log(f3.name); //myName


3.函数的toString方法返回函数的源码
function f1(){
  console.log(123);
}

console.log(f1.toString());

function f2(){/*
这是一个
注释
*/}
console.log(f2.toString());


实现多行字符串
function multiline(fn){
  var arr=fn.toString().split("\n");
  return arr.slice(1,arr.length-1).join("\n");
}
console.log(multiline(f2));
document.body.innerHTML="<pre>"+multiline(f2)+"</pre>";


函数的做用域:
做用域(scope)指的是变量存在的范围。Javascript只有两种做用域:一种是全局做用域,变量在整个程序中一直存在,全部地方均可以读取;另外一种是函数做用域,变量只在函数内部存在。

在函数外面声明的变量就是全局变量 能够在函数内部读取
var a=12;
function fn(){
  console.log(a);
}

fn(); //12

在函数内部定义的变量,称为局部变量,在函数外面读取不到
function fn(){
  var c=23;
}

console.log(c); //报错


函数内部定义的变量,会在做用域内覆盖同名的全局变量

var f=12;
function f5(){
  var f=44;
  console.log(f);
}
f5(); //44
console.log(f); //12


对于var声明的变量来讲,只有在函数内部声明的变量才是局部变量,其余区块声明的都是全局变量

if(true){
  var a=12;
}

console.log(a); //12


函数自己的做用域:
函数自己也是一个值,也有本身的做用域,函数的做用域就是其声明时所在的做用域,与其运行时所在的做用域无关

var s=12;
function fn(){
  console.log(s);
}

function fn1(n){
  var a=24;
  n();
}

fn1(fn); //12

函数体内部声明的函数,做用域绑定函数体内部。
function f2(){
  var n=33;
  return function f3(){
    console.log(n);
  }
}

var n=99;
f2()(); //33


函数内部变量的提高:
和全局做用域同样,函数内部的做用域也会产生变量提高的现象,var声明的变量,不论在什么位置,变量声明都会被提高到函数体内部的顶部

function fn(x){
  if(x>100){
    var temp=x-100;
  }
}

//等同于:
function fn(x){
  var temp;
  if(x>100){
    temp=x-100;
  }
}

相关文章
相关标签/搜索