JavaScript基础知识整理(引用类型-Function)
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)的更多相关文章
- JavaScript基础知识整理
只整理基础知识中关键技术,旨在系统性的学习和备忘. 1.在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值NaN ...
- JavaScript基础知识整理(2)
15.处理图像 注意:(1)在写js文件时,尽量将函数的声明往后写,将函数调用写在前面,这样能够使代码结构很清晰. (2)一个网页中翻转器一般超过3个,所以使用for循环减少重复使用翻转器代码的次数. ...
- Javascript 基础知识整理
Javascript的作用 表单验证,减轻服务器压力 添加页面动画效果 动态更改页面内容 Ajax网络请求(异步加载数据) -它属于前端的核心,主要用来控制和重新调整DOM,通过修改DOM结构,从而达 ...
- JavaScript基础知识整理(1)
粗略理解,努力入门中 1.在html中引入外部脚本: <script src="filename.js"></script> 2.注释: 多于一行的长注 ...
- JavaScript基础知识整理(1)数组
第一:创建. 1,var arr= new Array(); //数组为空.长度为0. arr[0]="apple"; arr[1]="orange"; arr ...
- javascript基础知识整理(不定时更新)
1.js中真与假的定义: 真:true,非零数字,非空字符串,非空对象 假:false,数字零,空字符串,空对象(null),undefined 2.使用for循环对json进行循环操作 for(va ...
- Javascript基础知识总结一
Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...
- Kali Linux渗透基础知识整理(二)漏洞扫描
Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...
- 学习javascript基础知识系列第二节 - this用法
通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...
- 学习javascript基础知识系列第三节 - ()()用法
总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...
随机推荐
- 9月28日——while循环知识补充、for循环、break及continue生效范围和range方法的介绍
目录 今日内容总结 一.while循环内容补充 1.死循环 2.嵌套和全局标志位 二.循环结构之for循环 概念介绍 for循环结构: 1.for结构 2.for...else结构 三.break和c ...
- W04 散文周刊 : 重回Emacs
W04 散文周刊 : 重回Emacs 邮箱:ppbhoy@qq.com 博客地址: www.pipihao.com 公纵号:南湖小皮 公告:后面会开始稳定更新 使用Emacs还是有些沉重,我一直将Em ...
- zookeeper05Curator
转https://blog.csdn.net/u012129558/article/details/81076487 1.zookeeper 开源客户端curator介绍 1.1 curator简 ...
- vscode环境配置(C/C++)
一.MinGW和vscode的简单了解 1.MinGW是什么? MinGW(Minimalist GNU on Windows).它实际上是将经典的开源 C语言 编译器 GCC 移植到了 Window ...
- IIS服务器SSL证书安装 (pfx文件不能直接运行时)
在证书控制台下载IIS版本证书,下载到本地的是一个压缩文件,解压后里面包含.pfx文件是证书文件,pfx_password.txt是证书文件的密码. 友情提示: 每次下载都会产生新密码,该密码仅匹配本 ...
- 服务调用OpenFeign
1.介绍 ①什么是OpenFeign OpenFeign是在Feign的基础上进行了加强 使用在Client-Consuemr(消费者客户端) Fiegn是一个声明式的Web服务客户端,让编写Web服 ...
- 如何在不额外读流的情况下计算md5值
设想这样一个场景:从网络流中读取文件到硬盘中并计算文件的md5值.通常的做法是先将文件保存下来,再计算文件的md5,但这样会一共会出现三次I/O,一次网络I/O,两次磁盘I/O. 导致额外磁盘I/O的 ...
- 用ChatGPT,绘制一个账号系统的C4架构图
hi,我是熵减,见字如面. 昨天我们用ChatGPT来设计一个账号系统,并尝试输出:模型表,类关系图,序列图,状态图等常用的架构设计中常用的元素. 今天,我们继续向更高层级延伸一下,看ChatGPT能 ...
- 三天吃透MySQL八股文(2023最新整理)
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
- 免杀之:MSF后门metasploit-loader免杀
免杀之:MSF后门metasploit-loader免杀 目录 免杀之:MSF后门metasploit-loader免杀 1 metasploit-loader后门代码 2 在kali中编译metas ...