Function类型

ECMAScript中函数是对象,每个函数都是Function类型的实例,也有属性和方法,函数是对象,函数名实际上市一个指向函数对象的指针,不会与某个函数绑定;

function sum(num1,num2){

return num1+num2;

}

同:

var sum=function(num1,num2){

return num1+num2;

};

(1)没有重载

若声明了两个同名函数,后面的函数会覆盖前面的函数;

(2)函数声明和函数表达式

解析器会率先读取函数声明,并使其在执行任何代码之前可以访问,而函数表达式,必须等到解析器执行到它所在的代码行,才会真正被解释执行;

alert(sum(10,10));

function sum(num1,num2){

return num1+num2;

}

以上代码正常执行,解析器在代码执行之前,读取并将函数声明添加到执行环境中,对代码求值时,js引擎在第一遍会声明函数并将它们放到源代码树的顶部;

以下代码中(函数表达式方法),在执行期间导致错误

alert(sum(10,10));

var sum=function(num1,num2){

return num1+num2;

}

函数位于一个初始化语句中,而不是一个函数声明,在执行到函数所在的语句之前,变量sum中不会保存有对函数的引用;

(3)作为值的函数

函数本身就是变量,函数可以作为值来使用,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回;

function callSomeFunction(somFunction,someArgment){

return someFunction(someArgment);

}

function add10(num){

return num+10;

}

var result=callSomeFunction(add10,10);

alert(result);   //20

可以从一个函数中返回另一个函数

function createComparisonFunction(propertyName){

return function(object1,object2){

var value1=object1[propertyName];

var value2=object2[propertyName];

if (value1<value2){

return -1;

}else if(value1>value2){

return 1;

}else {

return 0;

}

};

}

(4)函数内部属性

在函数内部有两个特殊的对象:arguments和this;

arguments保存函数参数,还有个callee属性,为一个指针,指向拥有这个arguments对象的函数;

function factorial(num){

if(num<=1){

return 1;

}else{

return num*arguments.callee(num-1);

}

}

this引用的是函数据以执行的环境对象;

ECMAScript5规范了另一个函数对象属性:caller,这个属性中保存着调用当前函数的函数的引用;如果是在全局作用域中调用当前函数,它的值为null;

当函数在严格模式下运行时,访问arguments.callee会导致错误,argumen.caller也是,在非严格模式下这个属性始终是undefined;

在严格模式下不能为函数的caller属性赋值,否则会导致错误;

(5)函数属性和方法

每个函数都包含两个属性:length和prototype;

length属性表示函数希望接收的命名参数的个数;

对于ECMAScript中的引用类型而言,prototype是保存它们所有实例方法的真正所在,prototype属性不可枚举;

每个函数都包含两个非继承而来的方法:apply和call;在特定的作用域中调用函数,即设置函数体内this对象的值;

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(10,10)); //20

alert(callSum2(10,10));  //20

在严格模式下,为指定环境对象而调用函数,this值不会转型为window;

call方法,传递给函数的参数必须逐个列举出来

function sum(num1,num2){

return num1+num2;

}

function callSum(num1,num2){

return sum.apply(this,num1,num2);

}

alert(callSum(10,10)); //20

apply和call真正强大的地方时能够扩充函数赖以运行的作用域;

window.color=”red”;

var o={color:”blue”};

function sayColor(){

alert(this.color);

}

sayColor();  //red

sayColor.call(this); //red

sayColor.call(window);  //red

sayColor.call(o);  //blue

ECMAScript5还定义了bind方法,这个方法会创建一个函数实例,其this值会被绑定到传给bind函数的值:

window.color=”red”;

var o={color:”blue”};

function sayColor(){

alert(this.color);

}

var objectSayColor=sayColor.bind(o);

objectSayColor();  //blue

每个函数继承的toLocalString和toString方法始终都会返回函数的代码;

JavaScript读书笔记(6)-Function的更多相关文章

  1. YDKJ 读书笔记 01 Function vs. Block Scope

    Introduction 本系列文章为You Don't Know JS的读书笔记. 书籍地址:https://github.com/getify/You-Dont-Know-JS Scope Fro ...

  2. 数据结构与算法JavaScript 读书笔记

    由于自己在对数组操作这块比较薄弱,然后经高人指点,需要好好的攻读一下这本书籍,原本想这个书名就比较高深,这下不好玩了.不过看着看着突然觉得讲的东西都比较基础.不过很多东西,平时还是没有注意到,故写出读 ...

  3. 你不知道的javascript读书笔记3

    概述 这是我看<你不知道的JavaScript(中卷)>中关于类型检查的笔记,供以后开发时参考,相信对其他人也有用. typeof 我们知道js中有七种内置类型:undefined, nu ...

  4. JavaScript读书笔记(1)

    从今天开启每天看书记笔记模式,<JavaScript高级程序设计(第3版)> 1. Javascript最初是为了解决输入验证器的问题,现在已经发展成一门复杂的语言: 2.  语言标准为E ...

  5. 高性能的JavaScript -- 读书笔记

    高性能的JavaScript 一.      加载和运行 将脚本放在底部 脚本下载解析执行时,页面已经加载完成并显示在用户面前 成组脚本 减少外部脚本文件数量,整合成一个文件 延迟脚本 动态脚本元素 ...

  6. <你不知道的JavaScript>读书笔记

    近几天看了一本不错的 JavaScript 的书,是 Kyle Simpson 写的 <You Don't know JS>.这本书是 Kyle Simpson 在 Github 上的开源 ...

  7. 高性能JavaScript读书笔记

    零.组织结构 根据引言,作者将全书划分为四个部分: 一.页面加载js的最佳方式(开发前准备) 二.改善js代码的编程技巧(开发中) 三.构建与部署(发布) 四.发布后性能检测与问题追踪(线上问题优化) ...

  8. javascript学习笔记 - 引用类型 Function

    五 Function类型 每个函数都时Function类型的实例.函数也是对象. 声明函数: function func_name () {} //javascript解析器会在程序执行时率先读取函数 ...

  9. JavaScript读书笔记(2)--数据类型

    1.  严格模式:在javascript中定义了一种不同的解析与执行模型.在严格模式下,一些不确定的行为将得到处理,对某些不安全的操作也会抛出错误. 用法是在脚本中添加:”use strict”; 这 ...

随机推荐

  1. codechef AUG17 T4 Palindromic Game

    Palindromic Game Problem Code: PALINGAM There are two players A, B playing a game. Player A has a st ...

  2. js 数组知识复习

    2.Array类型 2.1 创建数组 两种方式: 1.new Array(); //创建一个空数组 var arr1 = new Array(); //创建一个长度为10的空数组, var arr2 ...

  3. [LeetCode] Count and Say 字符串

    The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...

  4. [LeetCode] Climbing Stairs 斐波那契数列

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  5. /* Dr黄的技术博客开通啦 */

    以前懒得写技术日志, 现在终于发现重要性.. mark一下这个里程碑.

  6. 索尼(SONY) SVE1512S7C 把WIN8降成WIN7图文教程

    这两天接常接到客户要求把SONY笔记本的WIN8系统降成WIN7系统的单子,也接到很多毕业学员遇到最新的SONY笔记本不知道怎么进BIOS,进到BIOS不知道怎么设置从U盘启动,从U盘启动了安装了WI ...

  7. WKWebView携带不上cookie的问题处理

    自从WKWebView推出后Apple官方及众多开发者都推荐使用它代替UIWebView,确实通过加载速度.占用内存方面的对比都要好上几个档次,索性就把项目中的浏览器控件换成了WKWebView,一开 ...

  8. (5)centos图形界面安装

    1.登录 2.先安装MATE可视化桌面 yum groups install "MATE Desktop" 选择y 3.安装X Window System:图形接口 yum gro ...

  9. 利用Django徒手写个静态页面生成工具

    每个Geek对折腾自己的博客都有着一份执念 背景介绍 曾经多次在不同的平台写博客,但全部都以失败而告终.去年七月选择微信公众号做为平台开始了又一次的技术分享,庆幸一直坚持到现在,但随着文章发表的越来越 ...

  10. MAC(Linux)升级Openssl

    系统上一般默认安装的是0.9.8版本的Openssl,不能满足需要.这时候就要重新安装Openssl. 上官网下载新版openssl:https://www.openssl.org/source/ 解 ...