JavaScript基础之函数详解

目录
  • 一、函数简介
    • 1.1.函数的创建
    • 1.2.函数的参数和返回值
  • 二、函数的类型
    • 2.1. 构造函数
    • 2.2. 立即执行函数
    • 2.3. 构造函数的原型prototype
    • 2.4. 函数中的this指向
    • 2.5. 函数对象原型的方法
    • 2.6. 构造函数的继承
    • 2.7. 原型对象prototype方法继承
    • 2.8. Object.create实现类式继承
  • 总结

一、函数简介

1.1.函数的创建

1.函数创建的三种方式

    // 方式1:字符串封装代码创建函数
    var fun = new Function("console.log('hello 我是第一个函数');");
    console.log(fun);
    // 函数在被调用时执行
    fun()
    // 方式2:函数声明
    function fun2() {
      console.log(fun2)
    }
    fun2()
    // 方式3:函数表达式
    var fun3 = function () {
      console.log("我是匿名函数的封装的代码")
    };
    console.log(fun3)
    fun3();

1.2.函数的参数和返回值

1.函数的实参可以是一个对象或函数

    function mianji(r){
      return 3.14 * r * r;
    }
    function fun(a) {
      console.log("a = " + a)
    }
    fun(mianji(10))
    fun(mianji)

2.函数的返回值可以是一个对象或函数:

    function fun4(){
      function fun5(){
        alert("我是fun5")
      }
      return fun5;
    }
    a = fun4();
    console.log(a)   //输出fun5函数体
    a()   //输出"我是fun5"
    fun4()()   //输出"我是fun5"

二、函数的类型

2.1. 构造函数

    function Person(name, age, gender) {
      this.name = name;
      this.age = age;
      this.gender = gender;
      this.sayName = function () {
        alert(this.name)
      };
    }
    var per = new Person("张三", 15, "男")
    var per2 = new Person("李四", 16, "女")
    var per3 = new Person("王五", 17, "男")
    console.log(per)

构造函数执行流程:
1.立刻创建一个对象
2.将新建的对象设置为函数中this
3.逐行执行函数中的代码
4.新建的对象最为返回值返回
总结: 如上为构造函数,必须用new关键字调用,普通函数时直接调用,用this替代obj

2.2. 立即执行函数

    (function(){
      alert("我是一个匿名函数")
    })
    // 函数定义完,立即被调用,称为立即执行函数

2.3. 构造函数的原型prototype

1.JavaScript 规定,每一个构造函数都有一个prototype 属性。
2.构造函数通过原型分配的函数是所有对象所共享的
3.我们可以把那些不变的方法,直接定义在 prototype 对象上,这样所有对象的实例就可以共享这些方法。

简介:每一个对象都会有一个属性 proto 指向构造函数的 prototype 原型对象,实例对象使用构造函数 prototype 原型对象的属性和方法,因为对象有 proto 原型的存在。

2.4. 函数中的this指向

1.当以函数的形式调用时,this是window;
2.当以方法的形式调用时,谁调用方法 this就是谁;
3.当以构造函数的形式调用时,this就是新创建的那个对象。

2.5. 函数对象原型的方法

1.Function.prototype.call():使用一个指定的 this 值调用一个函数(简单理解为调用函数的方式,但是它可以改变函数的 this 指向)
2.Function.prototype.apply() 方法调用一个函数。简单理解为调用函数的方式,但是它可以改变函数的 this 指向
3. Function.prototype.bind() 方法不会调用函数,但是能改变函数内部this 指向,返回的是原函数改变this之后产生的新函数

	 // 1.call方法
	 var o = {
	     name:"张美丽"
	 }
	 function fn(a,b) {
	     console.log(this);
	     console.log(a + b);
	   }
	 fn(1,3) //此时的this指向的是window 运行结果:3
	 fn.call(o,1,2) //此时的this指向的是对象o  运行结果:输出对象o和3
	 // 2.apply方法
	 var o = {
	     name:'andy'
	 }
	 function fn1(a,b) {
	     console.log(this);
	     console.log(a + b)
	  }
	  fn()  //此时的this指向的是window 运行结果:3
	  fn.apply(o,[1,2])  //此时的this指向的对象o,运行结果:输出对象o和3
	 //  3.bind方法
	 var o = {
	     name:'andy'
	 }
	 function fn1(a,b) {
	     console.log(this);
	     console.log(a + b)
	  }
	  var f = fn.bind(o,1,2)  //此处的f是bind返回的新函数
	  f()  //调用新函数  this指向的是对象o

2.6. 构造函数的继承

1.先定义一个父构造函数
2.再定义一个子构造函数
3.子构造函数继承父构造函数的属性(使用call方法)

	// 1.父构造函数
	function Father(uname) {
	  // this 指向父构造函数的对象实例
	  this.uname = uname;
	}
	// 2.子构造函数
	function Son(uname, age) {
	  // this指向子构造函数的对象实例
	  // 3.使用call方式实现子继承父的属性
	  Father.call(this.uname);
	  this.age = age;
	}
	var son = new Son('王帅帅', 18);
	console.log(son);    // Son {age:18}

2.7. 原型对象prototype方法继承

// 1.父构造函数
function Father(uname, age) {
  // this 指向父构造函数的对象实例
  this.uname = uname;
  this.age = age;
}
Father.prototype.money = function() {
  console.log(100000);
 };
 // 2.子构造函数
  function Son(uname, age, score) {
      // this 指向子构造函数的对象实例
      Father.call(this, uname, age);
      this.score = score;
  }
// Son.prototype = Father.prototype;  这样直接赋值会有问题,如果修改了子原型对象,父原型对象也会跟着一起变化
  Son.prototype = new Father();
  // 如果利用对象的形式修改了原型对象,别忘了利用constructor 指回原来的构造函数
  Son.prototype.constructor = Son;
  // 这个是子构造函数专门的方法
  Son.prototype.exam = function() {
    console.log('孩子要考试');
  }
var son = new Son('王帅哥',18,100);
console.log(son);  //存在一个Father原型对象,在Father里面有age,uname,exam;money在fahter外层的原型对象里面。

2.8. Object.create实现类式继承

// 父类
function Shape() {
  this.x = 0;
  this.y = 0;
}
// 子类
function Rectangle() {
  Shape.call(this); // 调用父类的构造函数
}
// 将父类的原型对象,作为子类原型的原型对象。子类续承父类
Rectangle.prototype = Object.create(Shape.prototype);
// 设置子类原型的构造函数
Rectangle.prototype.constructor = Rectangle;
var r = new Rectangle();
r instanceof Rectangle;	// true
r instanceof Shape;		// true

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • javascript时间函数基础介绍

    javascript时间函数 javascript提供了Date对象来进行时间和日期的计算. Date对象有多种构造函数: new Date() //当前时间new Date(milliseconds) //距离起始时间1970年1月1日的毫秒数new Date(datestring) //字符串代表的日期与时间.此字符串可以使用Date.parse()转换,比如"Jannuary 1, 1998 20:13:15"new Date(year, month, day, hours, m

  • JavaScript函数基础详解

    什么是函数? 函数是完成某一功能的代码段 函数是可重复执行的代码段 函数方便管理和维护 自定义函数 通过function关键字 function 函数名称([参数,...]){ 代码段; return 返回值; } 注意 函数名称不要包含特殊字符 函数名称最好含义明确 函数名称最好遵循驼峰标记法或者下划线法 函数名称严格区分大小写 函数名称如果重复会产生覆盖 函数可以有参数也可以没有参数,可以有一个参数也可以有多个参数 函数通过return加返回值,如果没有return 默认返回undefine

  • JavaScript基础之立即执行函数

    目录 立即执行函数格式 立即执行函数其他方式–表达式 立即执行函数可以带参数 应用 总结 在JavaScript中有时候看到一些很神奇的函数比如下面截图: 这种函数只要浏览器加载的时候会自动运行,而需要调用,前面在闭包的时候也说过这种函数,一般将其称之为:立即执行函数. 立即函数的特征: 会自动执行 只会执行一次 立即执行函数格式 立即执行函数一般有格式如下: # 格式一(//W3C 推荐这种写法) (function (){ }()) #格式二 (但是这个才是最常用的方式之一) (functi

  • javascript函数式编程基础

    目录 一.引言 二.什么是函数式编程 三.纯函数(函数式编程的基石,无副作用的函数) 四.函数柯里化 五.函数组合 六.声明式和命令式代码 七.Point Free 八.示例应用 九.总结 一.引言 函数式编程的历史已经很悠久了,但是最近几年却频繁的出现在大众的视野,很多不支持函数式编程的语言也在积极加入闭包,匿名函数等非常典型的函数式编程特性.大量的前端框架也标榜自己使用了函数式编程的特性,好像一旦跟函数式编程沾边,就很高大上一样,而且还有一些专门针对函数式编程的框架和库,比如:RxJS.cy

  • JavaScript基础函数整理汇总

    这里给大家整理汇总了一些javascript的基础函数,都是比较常用和实用的.整理出来也有助于大家更好的理解javascript. 复制代码 代码如下: <script type="text/javascript">     /*创建函数和字面量函数*/     /*         function add(){             alert("函数创建成功")         };         var testfunction=functi

  • JavaScript基础之函数详解

    目录 一.函数简介 1.1.函数的创建 1.2.函数的参数和返回值 二.函数的类型 2.1. 构造函数 2.2. 立即执行函数 2.3. 构造函数的原型prototype 2.4. 函数中的this指向 2.5. 函数对象原型的方法 2.6. 构造函数的继承 2.7. 原型对象prototype方法继承 2.8. Object.create实现类式继承 总结 一.函数简介 1.1.函数的创建 1.函数创建的三种方式 // 方式1:字符串封装代码创建函数 var fun = new Functio

  • JavaScript基础之this详解

    JavaScript的this和Java等面向对象语言中的this大不一样,bind().call()和apply()函数更是将this的灵活度进一步延伸. 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习. 如果对JavaScript的关键字this理解不够深刻,有时候会掉入意想不到的坑.在这里我们总结了5条通用规则来帮助你判断this到底指向什么.虽然没有囊括所有的情况,但日常大部分情况都可以使用这些规则来正确推断. this的值通常是由所在函数的执行环境决定

  • JavaScript箭头(arrow)函数详解

    为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习. 本文我们介绍箭头(arrow)函数的优点. 更简洁的语法 我们先来按常规语法定义函数: function funcName(params) { return params + 2; } funcName(2); // 4 该函数使用箭头函数可以使用仅仅一行代码搞定! var funcName = (params) => params + 2 funcName(2); // 4 是不是很酷!虽然是一个极端简洁的例子

  • javascript基础之数据类型详解

    目录 1.数据类型 1.1 为什么需要数据类型 1.2 变量的数据类型 1.3 数据类型分类 2. 简单数据类型(基本数据类型) 2.1 数字型Number 1. 数字型进制 2.数字型范围 2.2 字符串型 String 1.字符串转义符 2.字符串长度 2.3 布尔型 Boolean 3.数据类型转换 3.1转换为字符串 3.2 转换为数字型 隐式转换 3.3 转换为布尔型 总结 1.数据类型 1.1 为什么需要数据类型 在计算机,不同的数据所占的存储空间是不同的,为了便于把数据分成所需内存

  • JavaScript基础学习之splice()函数详解

    目录 splice()函数详解 一.情况一(只有一个参数) 二.情况二 (两个参数) 三.情况三 (大于等于三个参数) 总结 splice()函数详解 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. 注释:该方法会改变原始数组. 参数: index —— 必需.整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置.howmany —— 必需.要删除的项目数量.如果设置为 0,则不会删除项目.item1, …, itemX —— 可选.向数组添加的新项目. 返回

  • javascript中Array()数组函数详解

    在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,JavaScript中数组十分灵活.强大,不像是Java等强类型高级语言数组只能存放同一类型或其子类型元素,JavaScript在同一个数组中可以存放多种类型的元素,而且是长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改. Array()是一个用来构建数组的内建构造器函数.数组主要由如下三种创建方式: array = new Array() array =

  • COM组件中调用JavaScript函数详解及实例

    COM组件中调用JavaScript函数详解及实例 要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度.这就要求使用回调函数,设其名称为scriptCallbackFunc.实现这个技术很简单: 1 .组件方(C++) 组件A 的方法在IDL中定义: [id(2)] HRESULT longCalc([in] DOUBLE v1, [in] DOUBLE v2, [in, optional

  • javascript回调函数详解

    在高级语言层出不穷的年代, 各个语言都号称有着一切皆为对象的自豪说法, 而 js 作为一门脚本语言却相对于java等传统面向对象语言有很大的不同之处, 除了 js 诡异的继承体系之外, 最令人着迷的一个特性就是回调函数, 当然也有很多人对他诟病, 笔者认为 回调函数 和 异步 是js语言特性的两大最为突出的店, 当然正如所有优点需要满足自我的需求, 这个世界没有银弹, 比如大量的使用回调函数将会使你的代码冗余, 错乱影响代码人的视觉与思维体验. 本文是自己对学习回调函数的的体会, 难免不完善甚至

  • python基础之匿名函数详解

    目录 1.匿名函数介绍 2.语法 3.使用场景 4.匿名函数和普通函数的对比 5.匿名函数的多种形式 6.lambda 作为一个参数传递 7. lambda函数与python内置函数配合使用 8.lambda 作为函数的返回值 1.匿名函数介绍 匿名函数指一类无须定义标识符的函数或子程序.Python用lambda语法定义匿名函数,只需用表达式而无需申明. 在python中,不通过def来声明函数名字,而是通过 lambda 关键字来定义的函数称为匿名函数. lambda函数能接收任何数量(可以

  • JavaScript中Array的filter函数详解

    目录 描述 理解 示例 原生实现 描述 filter为数组中的每个元素调用一次callback函数,并利用所有使得callback返回 true 或等价于 true 的值的元素创建一个新数组.callback只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用.那些没有通过callback 测试的元素会被跳过,不会被包含在新数组中. 理解 filter不会改变原数组,它返回过滤后的新数组. filter遍历的元素范围在第一次调用callback之前就已经确定了.在调用f

随机推荐