JavaScript函数

函数的定义和参数获取

  1. 定义函数
    ①用函数声明来创建函数(常用!)
    语法:
    function 函数名([形参1,形参2……形参n]){
    语句……
    }
function fun1(){
    console.log("第一个");
}
fun1();//调用

②构造函数

var fun1 = new Function("console.log('第一个');");
fun1();//调用函数

③用函数表达式(匿名函数)
语法:
var 函数名 = function([形参1,形参2……形参n]){
语句……
}

 var fun1 = function(){
     console.log("第一个");
 };//相当于赋值语句
 fun1();//调用函数

参数问题:规避参数不存在问题

var abs = function(x) {
  //手动抛出异常来判断
  if(typeof x!=='number') {
    throw 'Not a Number';
  }
  if(x>=0) {
    return x;
  } else {
    return -x;
  }
}
  1. arguments
    arguments是一个类数组对象(不是数组),也可通过索引操作数据,获取长度
function fun(){
    console.log(arguments.length);//保存实参,获取实参长度
    console.log(arguments[1]);//获取第二个实参
}
fun("hello","hello");//传递实参,返回2
  1. rest
    rest是ES6引入新特性,获取除了已经定义的参数之外的所有的参数。
function f(a,b,…rest) {
  console.log("a="+a);
  console.log("b="+b);
  console.log(rest);
}
 f(1,2,3,4,5);
/*a = 1
b = 2
Array(3) [ 3, 4, 5 ]
*/

rest参数只能写在最后面,必须用…标识

变量的作用域、let、const

  1. var定义变量有作用域
    ①在函数体中声明,则在函数体外不可使用
    ②在不同的函数体内部两个函数使用了相同的变量名不冲突
    ③内部函数可以访问外部函数的成员,反之则不行。
function f() {
  var x=1;
  function f3() {
    var y=x+1;//2
  }
  var z=y+1;//Uncaught ReferenceError: y is not defined
}

④若内部函数变量和外部函数变量重名,不会互相影响

function f1() {
  var a = 1;
  function f2() {
    var a = 'A'
    console.log('inner'+a);//innerA
  }
  console.log('outer'+a);//outer1
}

JavaScript中函数查找变量从自身函数开始,由“内”向“外”查找,假设外部存在这个同名的函数变量,则内部函数会自动屏蔽外部函数的变量

  1. 提升变量的作用域
function f() {
  var x="x"+y;
 console.log(x);//xundefined
  var y="y";
}

等同于:

function f() {
  var y;//只声明,未赋值
  var x="x"+y;
  console.log(x);
  y="y";
}

注意规范:所有的变量定义都放在头部

  1. 全局变量
    JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错RefrenceError。
  2. 规范
//唯一全局变量
var mai={ }
//定义全局变量
mai.name= "Q";
mai.add=function(a,b) {
  return a+b;
}

①把代码全部放入定义的唯一空间名字中,降低全局命名冲突问题。
②jQuery库把所定义的都放到jQuery中,用简化符$(selctor).action()

  1. var,let,const
    ①var定义的变量,具有函数作用域,可以跨块访问(没有块的概念), 不能跨函数访问,存在变量提升现象,且可多次声明。(声明的变量是全局的)
    ②let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问,不存在变量提升现象,且只能声明一次。(声明的变量作用域只在循环体内,解决局部作用域冲突问题)
    ③const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改

方法的定义和参数获取

this
①以函数形式调用,this永远都是window
②以方法形式调用,this就是调用方法的那个对象

 var name = "qz";
 function fun(){
     console.log(this.name);
 }
 var obj1 = {
     name:"xiaoq",
     sayName:fun
 }
 var obj2 ={
     name:"xiaoz",
     sayName:fun
 } 
 fun();//qz
 obj1.sayName();//xiaoq
 obj2.sayName();//xiaoz
 

apply
可用apply控制this的指向

 fun.apply(obj1);//xiaoq
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在js中,函数本身属于对象的一种,因此可以定义、赋值,作为对象的属性或者成为其他函数的参数。函数名只是函数这个对象...
    bjhu电net阅读 554评论 0 5
  • 今天用markdown来写,方便写js代码,富文本不会用,今天有点愁,不说了,直接讲知识点!最下面还有面试一般会问...
    艺术家吴老师阅读 799评论 0 0
  • 函数 js的函数时参数化的: 函数的定义会包括一个称为形参的标识符列表,这些参数会像局部变量一样工作 函数调用会为...
    石菖蒲_xl阅读 238评论 0 0
  • 1. 函数声明和函数表达式有什么区别 (*) 函数在JS中有三种方式来定义:函数声明(function decla...
    进击的阿群阅读 454评论 0 1
  • 函数创建方式### 1.声明方式例如:function consoleTip (){ console.log("t...
    留七七阅读 1,965评论 2 31