每个函数都是Function类型的实例,由于函数是对象,函数名实际上是一个指向函数对象的指针,不会与某个函数绑定。

1.函数的声明:

(1)函数声明语法:

  function sum (num1,num2) {

    return num1 + num2;

  }

(2)函数表达式语法:

  var sum = function (num1,num2) {

    return num1+num2

  };

(3)由于函数也是对象,所以也可以用构造函数声明

  var sum = new Function("num1","num2","return num1+num2"); // 可以接收任意数量参数,最后一个参数被看成函数体

    //  不推荐使用,因为解析了两次代码,首先要解析ECMAScript代码,然后解析传入的字符串

2.函数没有重载

  因为函数名是指针,声明同名函数只是改变了指针的指向

3.函数声明与函数表达式

  函数声明会发生变量提升,而函数表达式不会,一定得等js解析到函数所在语句才有效

4.函数内部属性

  在函数内部,有两个特殊的对象,arguments和this

  (1)arguments是一个类数组对象,包含着传入函数的所有参数,主要用途是保存函数参数

    arguments对象还有一个属性,callee 指针,指向拥有这个arguments对象的函数

    callee 可以用在递归中,消除函数名与函数执行紧紧耦合的现象

    比如常见递归  

    function factorial(num) {

      if(num <= 1) {

        return 1;

      } else {

        return num*factorial(num-1);

      }

    }

    可以把上述return 语句写为 return num*arguments.callee(num-1)

    当函数被赋给其他变量,即有另一个指针也指向函数,此时改写原函数,对另一个指针调用不会产生影响。

  (2)this 引用的是函数执行的环境对象,(当在网页的全局作用域调用时this对象引用的就是window)

5.函数属性和方法

  每个函数有两个属性length 和 prototype

  lengh表示函数希望接收的命名参数的个数

  方法: 设置函数体内this对象的值

  (1)apply() 接收两个参数,一个是在其中运行函数的作用域,一个是参数数组,可以是Array实例,也可以是arguments对象

  在严格模式下,若没有指定环境对象而调用函数,this值不会转型为window,除非明确使用apply或call方法,否则this将为undefined

  (2)call()方法与apply()作用相同,他们的区别在于接收参数不同,call接收其余所有参数,传递的参数必须逐个列举出来

  call 和 apply 最大的作用其实是扩充函数赖以运行的作用域

  如下例子:

    window.color = 'red';

    var o = {color : 'blue'};

    function sayColor() {

      alert(this.color);

    }

    sayColor();   // red

    sayColor.call(this);  // red

    sayColor.call(window); //red

    sayColor.call(o);  // blue 

    此处sayColor()是定义在全局中的函数,自身运行输出red很正常,

    然后通过call 绑定到this,window 都是一样的

    最后绑定到 o 对象上 为blue 也好理解

    相比于把函数加入到o对象中 o.sayColor  =  sayColor

   这种方法解除了 方法与对象的联系(耦合)

  (3)ECMAScript5  还定义了一个bind()方法,会创建一个函数的实例,其this值会被绑定到传给bind()函数的值

    window.color = 'red';

    var o = {color: "blue"};

    function sayColor () {

      alert(this.color)

    }

    var objectSayColor = sayColor.bind(o);

    objectSayColor();  //blue

    this值被绑定到o对象上,然后通过sayColor创建的实例赋给objectSayColor,所以objectSayColor 函数的this值也为o

JS Function类型的更多相关文章

  1. 【笔记】js Function类型 内部方法callee

    运用function实现阶乘 以往的做法是如下的 function factorial(num){ if(num <= 1){ return 1; }else{ return num * fac ...

  2. JS—Function类型

    1.函数的声明方式有三种普通函数的声明方式function box(num1,num2){ return num1+num2;}alert(box(1,2)); 使用变量初始化函数var box = ...

  3. 【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型

    前文提要:[js实例]js中的5种基本数据类型和9种操作符 Array类型的9个数组方法 Array中有9个数组方法: 1.检测数组 2.转换方法 3.栈方法 4.队列方法 5.冲排序方法6.操作方法 ...

  4. js判断类型方法

    在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null,Boolean, Number和String:复杂数据类型是Object,Object中 ...

  5. JavaScript高级 Function类型

    ·    Function类型 (属于引用类型) 1.JS中,有的函数均是对象,这个一个非常有特点的地方.它既然是对象,那么它的构造函数是谁呢?就是Function.(例如:function Pers ...

  6. JavaScript中的Function类型浅析

    1. Function类型是js中引用类型之一,每个函数实际上都是Function类型的实例对象,具有自己的属性和方法.正因为函数式对象,所以函数名实际上也是一个指向函数对象的指针. 2. 常用的函数 ...

  7. JavaScript之Function类型

    1. 创建方式 //1.函数声明 function sum(num1,num2){ return num1+num2; } //2.函数表达式 var sum = function(num1,num2 ...

  8. Javascript高级编程学习笔记(16)—— 引用类型(5) Function类型

    JS中许多有趣的地方都和函数脱不了联系 那么是什么让JS中的函数这么有趣呢? 我们一起来看看吧 Function类型 在JS中函数实际上就是对象,每个函数都是Function类型的实例,和JS的其他引 ...

  9. JS 强制类型转化

    在Js中, 强制类型转化分为两种情况: 一种是引用类型转化基本类型, 如数组转化成数字:一种是两种不同基本类型之间的转化,如字符串转化为数字.你不能将基本类型转化成引用类型,比如,不可能把数字转化为数 ...

随机推荐

  1. svn_linux + apache 实现网页访问svn

    CentOS7:搭建SVN + Apache 服务器实现网页访问 1. 安装httpd 安装httpd服务: $ sudo yum install httpd 检查httpd是否安装成功: $ htt ...

  2. STL用法大全

    1.    概述 泛型编程思想最早缘于A.Stepanov提出的部分算法可独立于数据结构的论断.20世纪90年代初A.Stepanov和Meng Lee根据泛型编程的理论用C++共同编写了STL.但直 ...

  3. C#通讯录——Windows Form Contact List

    C#通讯录 Windows Form Contact List 主窗口 using System; using System.Collections.Generic; using System.Com ...

  4. Android Studio编译OsmAnd出现警告:GeoPointParserUtil.java使用或覆盖了已过时的 API。有关详细信息请使用-Xlint:deprecation重新编译

    [背景] 之前折腾: [记录]Android Studio中导入OsmAnd并编译 期间,遇到了编译警告: 1 2 3 4 5 :OsmAnd-java:compileJava 注: E:\crifa ...

  5. 使用python解决算法和数据结构--使用栈实现符号匹配

    现在要自己来实现这些数据结构和常用算法了. 把基础再打牢一些. 栈的作用很大,无须多言. 我尽量看了题目要求,自己来实现代码的. # coding = utf-8 class Stack: def _ ...

  6. 使用docker方式安装etcd集群,带TLS证书

    网上文档也多,安装的时候,还是踩了几个坑. 现在作一个安装记录吧. 1,先作自签名的证书ca-csr.json(为了和k8s共用根证书,可能将信息调为k8s). { "CN": & ...

  7. javascript 中 x offsetX clientX screenX pageX的区别

    在javascript的事件对象中的关于事件鼠标位置的几个属性(x, pageX, offsetX, scrrenX clientX)及(y, pageY, offsetY, screenY, cli ...

  8. 2018项目UML设计-课堂实战

    1. 团队信息 队名:小白吃队 成员: 卢泽明 031602328 蔡文斌 031602301 葛亮 031602617 刘浩 031602423 张扬 031602345 李泓 031602321 ...

  9. JS浮点计算精度问题分析与解决

    问题描述 在JS计算四则运算时会遇到精度丢失的问题,会引起诸多问题,看看以下例子: 例如:在chrome控制台输入 0.1 + 0.7 输出结果是 0.7999999999999999 例如:0.1+ ...

  10. 通过impala更改Kudu表属性

    开发人员可以通过更改表的属性来更改 Impala 与给定 Kudu 表相关的元数据.这些属性包括表名, Kudu 主地址列表,以及表是否由 Impala (内部)或外部管理. Rename an Im ...