经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
JavaScript基础之函数详解
来源:jb51  时间:2021/12/20 19:46:08  对本文有异议

一、函数简介

1.1.函数的创建

1.函数创建的三种方式

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

1.2.函数的参数和返回值

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

  1. function mianji(r){
  2. return 3.14 * r * r;
  3. }
  4. function fun(a) {
  5. console.log("a = " + a)
  6. }
  7. fun(mianji(10))
  8. fun(mianji)

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

  1. function fun4(){
  2. function fun5(){
  3. alert("我是fun5")
  4. }
  5. return fun5;
  6. }
  7. a = fun4();
  8. console.log(a) //输出fun5函数体
  9. a() //输出"我是fun5"
  10. fun4()() //输出"我是fun5"

二、函数的类型

2.1. 构造函数

  1. function Person(name, age, gender) {
  2. this.name = name;
  3. this.age = age;
  4. this.gender = gender;
  5. this.sayName = function () {
  6. alert(this.name)
  7. };
  8. }
  9. var per = new Person("张三", 15, "男")
  10. var per2 = new Person("李四", 16, "女")
  11. var per3 = new Person("王五", 17, "男")
  12. console.log(per)

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

2.2. 立即执行函数

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

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. // 1.call方法
  2. var o = {
  3. name:"张美丽"
  4. }
  5. function fn(a,b) {
  6. console.log(this);
  7. console.log(a + b);
  8. }
  9. fn(1,3) //此时的this指向的是window 运行结果:3
  10. fn.call(o,1,2) //此时的this指向的是对象o 运行结果:输出对象o和3
  11. // 2.apply方法
  12. var o = {
  13. name:'andy'
  14. }
  15. function fn1(a,b) {
  16. console.log(this);
  17. console.log(a + b)
  18. }
  19. fn() //此时的this指向的是window 运行结果:3
  20. fn.apply(o,[1,2]) //此时的this指向的对象o,运行结果:输出对象o和3
  21. // 3.bind方法
  22. var o = {
  23. name:'andy'
  24. }
  25. function fn1(a,b) {
  26. console.log(this);
  27. console.log(a + b)
  28. }
  29. var f = fn.bind(o,1,2) //此处的f是bind返回的新函数
  30. f() //调用新函数 this指向的是对象o

2.6. 构造函数的继承

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

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

2.7. 原型对象prototype方法继承

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

2.8. Object.create实现类式继承

  1. // 父类
  2. function Shape() {
  3. this.x = 0;
  4. this.y = 0;
  5. }
  6. // 子类
  7. function Rectangle() {
  8. Shape.call(this); // 调用父类的构造函数
  9. }
  10. // 将父类的原型对象,作为子类原型的原型对象。子类续承父类
  11. Rectangle.prototype = Object.create(Shape.prototype);
  12. // 设置子类原型的构造函数
  13. Rectangle.prototype.constructor = Rectangle;
  14. var r = new Rectangle();
  15. r instanceof Rectangle; // true
  16. r instanceof Shape; // true

总结

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号