javascript Function类型

阅读数:68 评论数:0

跳转到新版页面

分类

html/css/js

正文

一、概述

函数实际上是对象,每个函数都是Function类型的实例,而且与其他引用类型一样具有属性和方法,因此函数名实际上也是一个指向函数对象的指针,因为函数名是指针,所以js没有函数重载

function sum(num1,num2){
  return num1+num2;
}

var sum = function(num1,num2){
  return num1+num2;
};
var sum = new Function("num1","num2","return num1+num2");

第一种方式称为函数声明,解析器通过一个函数声明提升的过程,读取并将函数声明添加到执行环境中。

第二种方式称为函数表达式,只有执行到它所行,解析器才解析。

第三种方式使用Function构造函数,不推荐,因为会有两次解析。

因为函数名本身就是变量,所以可以当作参数进行传递,也可以从一个函数中返回另一个函数。

function callSomeFunction(someFunction,someArgument){
  return someFunction(someArgument);
}

二、函数的内部属性

1、arguments

它是一个类数组对象,包含着传入函数中的所有参数,这个对象还有一个名为callee的属性。

(1)callee

指针,指向拥有这个arguments对象的函数。

function factorial(num){
  if(num<=1){ return 1;}
  else{
    return num*arguments.callee(num-1);
  }
}

这样,无论引用函数时使用的是什么名字,都可以保证正常完成递归调用。

当函数在严格模式下运行时,访问arguments.callee会导致错误。

2、this

指向函数据以执行的环境。当在全局作用域中执行函数时,指向window

3、caller

保存着调用当前函数的函数的引用,如果在全局作用域中调用当前函数,它的值为null。

严格模式还有一个限制,不能为函数的caller属性赋值。

三、函数的属性和方法

因为函数是对象,因此函数也有属性和方法。

1、length属性

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

2、prototype属性

prototype属性不可枚举,它保存了所有实例方法。

3、apply、calll方法

这两个方法的用途都是在特定的作用域中调用函数。

(1)apply

apply方法接收两个参数,一个是运行函数的作用域,另一个参数数组,可以是Array的实例,也可以是arguments对象

function sum(num1,num2){
  return num1+num2;
}
function callSum1(num1,num2){
  return sum.apply(this,arguments);
}
function callSum2(){
  return sum.apply(this,[num1,num2]);
}

(2)call

主要区别的接收参数的方式上,call要求把参数直接传递给函数。

function sum(num1,num2){
  return num1+num2;
}
function callSum1(num1,num2){
  return sum.call(this,num1,num2);
}

4、bind函数

当运行环境this指向bind参数,并创建函数的实例

var o = {color: "blue"};
function sayColor(){
 ....
}
var fun = sayColor.bind(o);



相关推荐

一、概述 Function.prototype.bind 是 JavaScript 中的一个方法,用于创建一个新的函数,该函数在调用时将 this 绑定到指定的对象,并且可以传递预设的参数。bind

一、函数声明 function fn(arg0,arg1,arg2){ // 函数体 } 它的一个重特征,就是可以把它放在调用它的语句之后。 sayHi(); function sayHi()

echarts 是百度公司前端开发一个图表库,支持柱状图、饼状图、k线图、map图、热导向图、折线图。 主要采用canvas画图。完全免费。 hi

因为map的key可以为任何类型, 包括对象. 但是JSON语法, key只能为string. 所以不能直接对JSON.stringify(Map). 1.但是可以先把map转换为

在使用Vue中经常看到HTML中有标签属性前面添加了“:”,有些没有。 其实是v-bind的缩写。 v-bind 缩写: ‘:’ 用法:动态绑定一个或多个特性,或一个组件prop到表达式。在绑定cl

一、package.json package.json文件只能锁定大版本,也就是版本号的第一位,并不能锁定后面的小版本。 二、package-lock.json package-lock.json文件

module.exports = { "plugins": { "postcss-import": {},

/** * 参考文档 * 【eslint英文文档】https://eslint.org/docs/user-guide/con

dva是一个基于redux和redux-sage的数据流方案, 然后为了简化开发体验, dva还额外内置了react-router和fetch. 参考: <a href="http

umi是一个可插拔的企业级react应用框架, umi以路由为基础. 参考: <a href="https://umijs.org/zh/guide/#%E7%89%B9%E6%8