函数:定义一次,多次调用;用于对象的属性则称为对象的方法;在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. [原创] Trie树 php 实现敏感词过滤

    目录 背景 简介 存储结构 PHP 其他语言 字符串分割 示例代码 php 优化 缓存字典树 常驻服务 参考文章 背景 项目中需要过滤用户发送的聊天文本, 由于敏感词有将近2W条, 如果用 str_r ...

  2. pycharm连接数据库出现时区jdbc问题

    unrecognized or represents more than one time zone. You must configure either the server or JDBC dri ...

  3. android4.0以上访问网络不能在主线程中进行以及在线程中操作UI的解决方法

    MONO 调用一个线程操作UI 然后报Only the original thread that created a view hierarchy can touch its views.错误 goo ...

  4. python-thread多线程

    #!/usr/bin/python import threading,time def Music(): print "music is playing" time.sleep(3 ...

  5. Session 与 Cookie

    Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们本身只是HTTP中的一个配置项,在servlet规范中也只对应一个类而已. 理解 Cookie 通俗地说就是当一 ...

  6. [PY3]——内置数据结构(7)——字典及其常用操作

    字典及其常用操作Xmind图 关于字典 字典是一种key-value结构 字典是无序的 字典的定义 # {}大括号可以直接定义一个空字典 In [1]: d={};type(d) Out[1]: di ...

  7. js 继承介绍

    js中继承的方式并不是明确的,这里介绍常用的几种 一.对象冒充(构造函数绑定) 原理:使用对象冒充继承基类,实质上是使用call或apply方法改变this 指针的指向 function Monkey ...

  8. SQL:存储过程

    1/什么是存储过程及概念 Transact-SQL中的存储过程,非常类似于.Net语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可 ...

  9. 从零开始学JAVA(08)-使用SpringMVC4 Restful 风格引用静态文件 css/js/png

    在写完helloworld后想给网页加点样式(*.css),结果怎么也显示不了,百度了很多种方法后试行尝试,试验成功并记录下来,方便以后查看. 时隔两年,继续学习JAVA,太久没学了,忘记得差不多,还 ...

  10. 常用 JavaScript 小技巧及原理详解

    善于利用JS中的小知识的利用,可以很简洁的编写代码 1. 使用!!模拟Boolean()函数 原理:逻辑非操作一个数据对象时,会先将数据对象转换为布尔值,然后取反,两个!!重复取反,就实现了转换为布尔 ...