函数:定义一次,多次调用;用于对象的属性则称为对象的方法;在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. 关于在JS中AJAX导致跨域问题的解决

    在部署一个原声的前端项目的时候,请求该服务器后端接口时发现出现了CORS跨域的问题,但是服务端已经做了同源策略的兼容,常见问题,遂记录. 报错信息: XMLHttpRequest cannot loa ...

  2. Java多线程—阻塞队列和生产者-消费者模式

    阻塞队列支持生产者-消费者这种设计模式.该模式将“找出需要完成的工作”与“执行工作”这两个过程分离开来,并把工作项放入一个“待完成“列表中以便在随后处理,而不是找出后立即处理.生产者-消费者模式能简化 ...

  3. C#-WebForm-GridView表格展示数据

    GrideView 控件,功能是将数据库的数据用表格的形式展示在页面上 一.<源>代码中放入 GridView 控件 打开<设计>界面 二.绑定数据源 (一)创建 LinQ 类 ...

  4. H01-Linux系统中搭建Hadoop和Spark集群

    前言 1.操作系统:Centos7 2.安装时使用的是root用户.也可以用其他非root用户,非root的话要注意操作时的权限问题. 3.安装的Hadoop版本是2.6.5,Spark版本是2.2. ...

  5. MDX常用几种查询对比

    MDX1: SELECT NON EMPTY {Hierarchize( { [Measures].[年初数 的总和], [Measures].[期末数 的总和], [Measures].[本期发生数 ...

  6. Mac下运行git报错"xcrun: error: invalid active developer path .."

    错误:xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun ...

  7. 字符编码的来源,ascii、unicode和utf-8编码的关系

    字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...

  8. 大数乘法的C代码实现

    在C语言中,宽度最大的无符号整数类型是unsigned long long, 占8个字节.那么,如果整数超过8个字节,如何进行大数乘法呢? 例如: $ python Python 2.7.6 (def ...

  9. POJ 1577 Falling Leaves 二叉搜索树

    HDU 3791 Falling Leaves 二叉搜索树  Figure 1Figure 1 shows a graphical representation of a binary tree of ...

  10. Nexus centos 安装

    目录 1.安装nexus 2.启动nexus 2.1启动服务器 2.2以后台进程启动: 2.3web访问 3.搭建私服 3.1 界面元素介绍 3.2 仓库集合的界面 3.3 通过网页方式将jar包上传 ...