函数:定义一次,多次调用;用于对象的属性则称为对象的方法;在JavaScript中,函数即对象;嵌套的函数形成闭包;

定义函数和简单调用函数:

            //函数定义
function f1(){ //没有参数的函数
return true;
}
function f2(x,y){//有参数的函数
return x+y;
}
var f3=new Function("x","y","return x+y"); //new方法定义函数
var f4 = function(x,y){return x+y;} //表达式定义函数
var f5 = function fac(x){if(x<=1) return 1;return x*fac(x-1);} //表达式定义一个有名字的函数f5,递归调用函数 //函数的用法
console.log(f5(5)); //直接调用
var f6 = (function(x){return x*x;})(10); //定义后立即调用执行,此时f6是number 100
var data = [1,3,2,5,4];
var sort = data.sort(function(a,b){return a-b;}); //函数作为值传递给其他函数
function f7(x,y){
function square(a){ return a*a};
return square(x)+square(y); //内部函数square可以直接访问外部函数f7的参数x,y
} console.log(f7(2,3));

函数的形参和实参

            //实例:给数组中添加元素
function addElement(e,a){
a = a || []; //注意这句 : 未定义则为空数组,这样在调用函数的时候第二个参数可以不传
a.push(e);
return a;
}
var arr = [1,2,3];
console.log(addElement(4));
console.log(addElement(4,arr));
//arguments参数数组
var factorial = function (x){
if(x<=1) return 1;
return x*arguments.callee(x-1); //arguments.callee递归的调用自身
}

作为值得函数:将函数赋值给变量,赋值给对象的属性,作为其他函数的参数,都是函数作为值得表现。

函数作用域:在函数中声明的变量,在函数体内都是可见的(包括嵌套函数内),在函数外部是不可见的,要想在函数外部访问,需要用到闭包;

关于闭包:

理解闭包:闭包是一种特性:通过作用域链,函数体内部的变量都可以保存在函数作用域内。这个变量作用域是在函数定义时就决定的。

但是:调用时的变量作用域和定义函数时的变量作用域不一样的时候呢?答案是:总是返回定义函数时的变量作用域。

闭包的用途:

1、访问函数作用域内的变量

            //嵌套函数的词法作用域规则
var str="global";
function check(){
var str="local";
function f(){return str};
return f();
}
console.log(check()); //local var str1="global";
function check1(){
var str1="local";
function f(){return str1};
return f;
}
//这里看似调用潜逃的函数f() 在函数作用域外没有这个函数,但是同样返回local;因为变量作用域链在函数定义的时候就创建了
console.log(check1()()); //local

2、防止变量污染

            var count = 1;  //这里的变量可以影响函数体common的结果
function common(){
return count++;
}
common();
console.log(count); // 2 var a = 3; //这里变量a可以随意定义,不会污染影响now函数体内的变量
//定义一个函数并立即调用
var now=(function f(){
var a=1;
return function(){
return ++a;
}
})();
console.log(now());

函数的属性、方法

            //函数的属性、方法和构造函数
//属性length和prototype function f(x,y,z){
return x+y+z;
}
console.log(f.call(this,1,3,4)); //
console.log(f.apply(this,[1,2,3])); //
var array=[1,2,3,4,5];
var max=Math.max.apply(this,array);
var max1=Math.max(1,2,3,4,5);
var max2=Math.max.call(this,1,2,3,4,5);
console.log(max+" "+max1+" "+max2); / 5 5 5 //bind()方法 给对象绑定一个自定义的函数
var o={x:1}; //待绑定的对象
function fn(y){return this.x+y};//待绑定的函数
var g= fn.bind(o);
console.log(g(2)); // 3 function obf(f,o){
if(f.bind){
return f.bind(o);
}else{
return function(){
return f.apply(o,arguments);
}
}
}
var g1=obf(fn,o);
console.log(g1(2)); //3 var sum=function(x,y){return x+y};
var sum1=sum.bind(null,1);
console.log(sum1(2)); // var sum2=function(y,z){return this.x+y+z};
var sum3=sum2.bind({x:1},2); //绑定this和y
console.log(sum3(3));

JavaScript的进阶之路(六)理解函数的更多相关文章

  1. JavaScript的进阶之路(五)理解数组1

    数组是值得有序结合,每个值叫做一个元素,每个元素的位置称为索引,索引从0开始. 在JavaScript中,数组是对象的特殊形式.继承自Array.prototype中的属性,有丰富的数组操作方法. 通 ...

  2. JavaScript的进阶之路(四)理解对象2

    对象的三个属性 原型属性 1.var v={}的原型是Object.prototype;继承了一个constructor属性指代Object()构造函数,实际的原型是constructor.proto ...

  3. JavaScript的进阶之路(四)理解对象1

    对象是JavaScript的基本数据类型.简单的名值对组成了对象,BUT:还可以从一个被称为原型的对象继承属性,对象的方法通常就是继承的属性. 对象最常见的用法有:创建.设置.查找.删除.检测.枚举它 ...

  4. JavaScript的进阶之路(二)函数简介,变量、作用域和内存问题

    <h3>ECMAScript中函数不存在函数签名的概念,没有重载</h3><h3>无需指定返回值,可以在任何时候返回任何值.未指定返回值的函数,返回的是一个特殊的u ...

  5. JavaScript的进阶之路(五)理解数组2

    数组方法 //定义一个测试数组 var array1 = [1,2,5,null,"a"]; //join()方法是String.split()方法的逆操作,后者是将字符串分割成若 ...

  6. JavaScript的进阶之路(一)

    JavaScript由ECMAScript BOM DOM三部分组成 ECMAScript重要版本1,3,5,6,提供核心语言功能 DOM提供访问和操作网页内容的方法和接口 BOM提供与浏览器交互的的 ...

  7. JavaScript正则进阶之路——活学妙用奇淫正则表达式

    原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴. 有些童鞋肯定 ...

  8. PHP 进阶之路 - 深入理解 FastCGI 协议以及在 PHP 中的实现

    在讨论 FastCGI 之前,不得不说传统的 CGI 的工作原理,同时应该大概了解 CGI 1.1 协议 传统 CGI 工作原理分析 客户端访问某个 URL 地址之后,通过 GET/POST/PUT ...

  9. JavaScript的进阶之路(七)客户端JavaScript知识点总结

    一.客户端JavaScript主要是BOM DOM的操作和js脚本的兼容性.互用性.可访问性.安全性的应用.以及一些框架的引用. 二.BOM:浏览器对象模型 主要介绍window对象 1.定时器:se ...

随机推荐

  1. leetcode-79-单词搜索(用dfs解决)

    题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许 ...

  2. L04-VirtualBox中CentOS7网络配置(可连外网)

    本文所述的方法在RHEL6.5.RHEL7和CentOS6.5中同样适用. 1.工具:VirtualBox,虚拟机:CentOS7 2.VirtualBox工具中的网络配置 (1)VirtualBox ...

  3. Saiku 系列

    1.Saiku2.6 Saiku315 链接SQL的JDBC字符串 2.Saiku2.6 配置数据源 3.Saiku2.6 保存查询后,重新打开报 Error Loading Query错误. 4.C ...

  4. IntelliJ IDEA 2018.3(Ultimate Edition)激活方法

    本因博主Windos10系统上IDEA 2017会出现自带输入法候选框不跟随光标的问题,故更新了IntelliJ IDEA 2018,当时官方发布虽然还是Beta版本,但是迫于输入中文累死眼睛的窘态下 ...

  5. HAL库定时器

    1.在cubmx中设置时钟源,设置对应的定时器,预分频系数,计数模式,是否自动重装载,中断使能,中断优先级 2.HAL_TIM_Base_Start_IT(&htim2);开启定时器中断 3. ...

  6. 2018焦作网络赛 - Poor God Water 一道水题的教训

    本题算是签到题,但由于赛中花费了过多的时间去滴吧格,造成了不必要的浪费以及智商掉线,所以有必要记录一下坑点 题意:方格从1到n,每一格mjl可以选择吃鱼/巧克力/鸡腿,求走到n格时满足 1.每三格不可 ...

  7. [转] 2018年最新桌面CPU性能排行天梯图(含至强处理器)

    [FROM] http://www.idn100.com/zuzhuangdiannaopeizhi-pc2849/ 排名 处理器 图例 分数 1 Intel Xeon Platinum 8173M ...

  8. pull强制覆盖本地

    今天我总结的是在项目中经常用到的Git命令,上传和下拉文件. 当然在进行上传和下拉操作之前,你首先要做的就是将本地和Git库连接起来. 连接命令: git remote add origin + 你G ...

  9. 第十篇----------javascript函数的三种定义方式及区别

    javascript定义函数有3种方式: //3种函数定义方式,前两种常用 /** * 1,function 语句式 * 形式:句子 * 名称:有名 * 性质:静态 * 解析时机:优先解析 * 作用域 ...

  10. Dalvik与JVM区别

    1.Dalvik出现和SDK层面采用java为开发语言的原因 1.1 避免Native作为应用代码导致的因为设备多样化导致App生态了支离破碎,是从Nokia哪里的教训. 1.2 重新实现Dalvik ...