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进行执行和演示 ...
随机推荐
- ColorFolder文件管理工具使用教程
ColorFolder ColorFolder Mac中文版是Mac上的一款文件夹图标修改工具,可以帮助您一键改变文件夹的颜色.帮助你更好的保持良好排序和分类,让你的文件显得更有条理,并有效提高文件管 ...
- 郁金香 用C写一个定时器来循环获取阳光
先来张效果图 定时器代码 HWND 游戏窗口句柄 = FindWindowA("MainWindow", "植物大战僵尸中文版"); ::SetTimer( ...
- js根据某个字段进行分组
分组前数据: [ {"f1":"q","f2":"w","f3":"e",&qu ...
- Prometheus安装部署(主体)
Prometheus安装部署 一,下载安装包并解压 下载地址:https://github.com/prometheus/prometheus/releases 因为服务器上下载速度太慢,所以可以提前 ...
- 实现 JSON 高亮
JSON 转换 HTML function formatJson(json) { let regexp = /("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"]) ...
- Postgresql 锁等待检测及处理
背景 对于多数数据库,dba技能之一就是查找锁.锁的存在有效合理的在多并发场景下保证业务有序进行.下面我们看一下Postgresql中查找阻塞的方法. 1.找到"被阻塞者",获取被 ...
- 硬件监控:grafana+prometheus+node_exporter
一.前期准备: grafana:前端展示平台,没有数据存储功能,但是,它有不同的展示模板,然后,把后端数据库中提供的数据,进行展示 -->展示数据 prometheus(普罗米修斯):时序数据库 ...
- video.js没有显示已播放时间、总时间?
我们在JS中设置了显示两个时间,但是没有显示. 经过查找,有的博文说或许是JS版本太高?我们没有换JS.另一篇博文给了我们启发,修改下样式就好了,我们一看,真的是样式问题 都改成block后就看到时间 ...
- 关于使用C++调用WCF的方法
因为近期要对接别人的接口,使用的是wcf,因为之前没有使用过wcf,更不了解它,于是在使用的时候出现了很多问题. 下面就记录一下下 在调用方法之前,我们一般都会拿到一个地址,http://xxxxxx ...
- 【C学习笔记】day3-3 编写程序数一下 1到 100 的所有整数中出现多少个数字9
#include <stdio.h> int main() { int cou=0; for (int i = 1; i <= 100; i++) { if (i % 10 == 9 ...