Function

Function类型实际上是对象,每个函数都是Function类型的实例,自然也就具有属性和方法。


定义函数通常有三种方式

使用函数声明

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

使用函数表达式

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

使用Function构造函数(因为解析代码次数会增加,所以不推荐用这种方式)

var sum = new Function("num1","num2","return num1 + num2");//最后一个参数作为函数体,其余参数为创建函数的参数

函数声明方式声明的函数会先被解析器读取,在其他代码执行前,这种函数已经处于能被访问的状态了


函数名实际上是指向函数对象的指针,所以函数名和函数并没有互相绑定,多个函数名可以指向同一个函数,在其他oo语言中会有函数重载,ECMAScript中并没有,因为当出现具有相同名称而内容不同的函数时,函数名指向了最新的函数,也就不存在同时表示多个函数体的情况了。

var sum = function(num1,num2){
return num1 + num2;
}
alert(sum(5,5));//10
var anotherSum = sum;
alert(anotherSum(5,5));//10
sum = null;
alert(anotherSum(5,5));//10
var add = function(num){
return num + 100;
};
var add = function(num){
return num + 200;
};
var result = add(100);//300

函数作为变量可以作为参数传递给另一个函数,也可以通过函数返回一个函数

function callSomeFunction(someFunction,someArgument){
return someFunction(someArgument);
}
function add(num){
return num + 10;
}
var result = callSomeFunction(add,10);//20

函数内部有三个特殊对象,arguments,this,caller.arguments作为一个与数组类似的对象,保存着传给函数的参数,并且拥有一个callee属性,指向函数本身。

这个callee属性可以解除函数名与函数体的耦合。(通常在函数调用本身时发挥作用)

function factorial(num){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num - 1); //不仅仅把函数名局限于factorial
}
}
var newFactorial = factorial;
factorial = new function(){
return 0;
}
alert(newFactorial(5));//120
alert(factorial(5));//0

this对象引用的是函数的运行环境对象

window.color = "red";
var o = {color : "green"};
function sayColor(){
alert(this.color);
}
o.sayColor = sayColor();
sayColor();//"red"
o.sayColor();//"green"

caller属性保存着调用当前函数的函数的引用,也就是上一级函数的引用。


函数拥有两个非继承属性和三个非继承方法分别是length,prototype,apply(),call()和bind().

length表示函数希望接收的命名参数的个数,prototype是一个指向函数原型的指针,这在模拟继承上有很大的作用。

apply()和call()可以让函数作用在某个特定的作用域,这样可以扩充函数能够运行的作用域。

apply()接收两个参数,第一个参数是指定函数在哪个作用域中调用,第二个参数是参数数组(可以是Array的实例也可以是arguments对象)。

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

call()与apply()基本相同,不同之处在于接收参数的方式,call()接收参数时,必须把参数逐个列举出来,老老实实一个对应一个。

function sum(num1,num2){
return num1 + num2;
}
function callSum(num1,num2){
return sum.call(this,num1,num2);
}
alert(callSum(5,5));//10

bind()可以创建一个函数实例,这个实例改变了其函数的this,让其this指向传给bind()的参数

window.color = "red";
var obj = {color : "green"};
function sayColor(){
alert(this.color);
}
var objSayColor = sayColor.bind(obj);
objSayColor();//"green"

JavaScript基础知识整理(引用类型-Function)的更多相关文章

  1. JavaScript基础知识整理

    只整理基础知识中关键技术,旨在系统性的学习和备忘. 1.在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值NaN ...

  2. JavaScript基础知识整理(2)

    15.处理图像 注意:(1)在写js文件时,尽量将函数的声明往后写,将函数调用写在前面,这样能够使代码结构很清晰. (2)一个网页中翻转器一般超过3个,所以使用for循环减少重复使用翻转器代码的次数. ...

  3. Javascript 基础知识整理

    Javascript的作用 表单验证,减轻服务器压力 添加页面动画效果 动态更改页面内容 Ajax网络请求(异步加载数据) -它属于前端的核心,主要用来控制和重新调整DOM,通过修改DOM结构,从而达 ...

  4. JavaScript基础知识整理(1)

    粗略理解,努力入门中 1.在html中引入外部脚本:  <script src="filename.js"></script> 2.注释:  多于一行的长注 ...

  5. JavaScript基础知识整理(1)数组

    第一:创建. 1,var arr= new Array(); //数组为空.长度为0. arr[0]="apple"; arr[1]="orange"; arr ...

  6. javascript基础知识整理(不定时更新)

    1.js中真与假的定义: 真:true,非零数字,非空字符串,非空对象 假:false,数字零,空字符串,空对象(null),undefined 2.使用for循环对json进行循环操作 for(va ...

  7. Javascript基础知识总结一

    Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

  8. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  9. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  10. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...

随机推荐

  1. Solon 的插件热插拨管理机制(H-Spi)

    插件热插拨管理机制,简称:H-Spi.是框架提供的生产时用的另一种高级扩展方案.相对E-Spi,H-Spi 更侧重隔离.热插热拨.及管理性. 应用时,是以一个业务模块为单位进行开发,且封装为一个独立插 ...

  2. maven打包失败 Cannot create resource output directory

    转https://blog.csdn.net/wuyuanshun/article/details/103097447 maven clean后打包出现Cannot create resource o ...

  3. vs code 关联gitee码云或github以及GIT 常用命令

    一.准备 1.本地安装vs code 和GIT源代码管理工具 2.配置vscode git全局变量 打开左下角设置-->点击用户-->搜索git.path-->settings.js ...

  4. 【爬虫+数据清洗+可视化分析】舆情分析哔哩哔哩"狂飙"的评论

    目录 一.背景介绍 二.爬虫代码 2.1 展示爬取结果 2.2 爬虫代码讲解 三.可视化代码 3.1 读取数据 3.2 数据清洗 3.3 可视化 3.3.1 IP属地分析-柱形图 3.3.2 评论时间 ...

  5. xml基本学习

    概念:可拓展标记语言.可拓展即标签都是自定义的.标记语言即由标签构成的语言. 功能:存储数据: 配置文件 在网络中传输 语法 基本语法: xml文件后缀名为.xml xml第一行必须定义为文档声明 x ...

  6. app实现外部浏览器打开链接

    需求:安卓和IOS开发的混合app.前端使用vue,vant2,安卓使用java,ios使用的object-c.实现效果:点击按钮,下载PDF附件,app跳转到手机外部浏览器,下载附件...... 1 ...

  7. SnowFlake 雪花算法详解与实现 & MP中的应用

    BackGround 现在的服务基本是分布式,微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性. 对于 MySQL 而言,一个表中的主键 id 一般使用自 ...

  8. servlet传入多个数据

    通过&来传入值:<a href="bookquery?page=1&nameBook=&author=&publisher=>1</a> ...

  9. Axios、Vue组件-生命周期、计算属性、Slot插槽、自定义事件、v-router、钩子函数

    Axios:网络通信 <script> var vm =new vue({ el:"#app", data(){ return{ info:{ //返回的数据必须和js ...

  10. vivo版本发布平台:带宽智能调控优化实践-平台产品系列03

    vivo 互联网平台产品研发团队 - Peng Zhong 随着分发规模地逐步增长,各企业对CDN带宽的使用越来越多.并且,各类业务使用CDN的场景各式各样,导致带宽会不断地出现骤增骤降等问题.基于成 ...