JavaScript读书笔记(6)-Function
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的更多相关文章
- YDKJ 读书笔记 01 Function vs. Block Scope
Introduction 本系列文章为You Don't Know JS的读书笔记. 书籍地址:https://github.com/getify/You-Dont-Know-JS Scope Fro ...
- 数据结构与算法JavaScript 读书笔记
由于自己在对数组操作这块比较薄弱,然后经高人指点,需要好好的攻读一下这本书籍,原本想这个书名就比较高深,这下不好玩了.不过看着看着突然觉得讲的东西都比较基础.不过很多东西,平时还是没有注意到,故写出读 ...
- 你不知道的javascript读书笔记3
概述 这是我看<你不知道的JavaScript(中卷)>中关于类型检查的笔记,供以后开发时参考,相信对其他人也有用. typeof 我们知道js中有七种内置类型:undefined, nu ...
- JavaScript读书笔记(1)
从今天开启每天看书记笔记模式,<JavaScript高级程序设计(第3版)> 1. Javascript最初是为了解决输入验证器的问题,现在已经发展成一门复杂的语言: 2. 语言标准为E ...
- 高性能的JavaScript -- 读书笔记
高性能的JavaScript 一. 加载和运行 将脚本放在底部 脚本下载解析执行时,页面已经加载完成并显示在用户面前 成组脚本 减少外部脚本文件数量,整合成一个文件 延迟脚本 动态脚本元素 ...
- <你不知道的JavaScript>读书笔记
近几天看了一本不错的 JavaScript 的书,是 Kyle Simpson 写的 <You Don't know JS>.这本书是 Kyle Simpson 在 Github 上的开源 ...
- 高性能JavaScript读书笔记
零.组织结构 根据引言,作者将全书划分为四个部分: 一.页面加载js的最佳方式(开发前准备) 二.改善js代码的编程技巧(开发中) 三.构建与部署(发布) 四.发布后性能检测与问题追踪(线上问题优化) ...
- javascript学习笔记 - 引用类型 Function
五 Function类型 每个函数都时Function类型的实例.函数也是对象. 声明函数: function func_name () {} //javascript解析器会在程序执行时率先读取函数 ...
- JavaScript读书笔记(2)--数据类型
1. 严格模式:在javascript中定义了一种不同的解析与执行模型.在严格模式下,一些不确定的行为将得到处理,对某些不安全的操作也会抛出错误. 用法是在脚本中添加:”use strict”; 这 ...
随机推荐
- 【HDOJ5519】Kykneion asma(状压DP,容斥)
题意:给定n和a[i](i=0..4),求所有n位5进制数中没有前导0且i出现的次数不超过a[i]的数的个数 2<=n<=15000,0<=a[i]<=3e4 思路:设f(n, ...
- BZOJ【1606】购买干草
1606: [Usaco2008 Dec]Hay For Sale 购买干草 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 859 Solved: 63 ...
- [CODEVS2035]机票打折问题
题目描述 Description .输入机票原价(3到4位的正整数,单位:元),再输入机票打折率(小数点后最多一位数字).编程计算打折后机票的实际价格(单位:元.计算结果要将个位数四舍五入到十位数“元 ...
- 分享C#识别图片上的数字
通过Emgu实现对图片上的数字进行识别.前期步骤:1.下载Emgu安装文件,我的版本是2.4.2.1777.3.0版本则实现对中文的支持.2.安装后需填写环境变量,环境变量Path值后加入Emgu安装 ...
- List集合使用注意的问题
在做自动保存草稿的功能遇到集合数据的问题,先贴自动保存草稿的代码 /** * 每5 秒保存一次草稿 */private void startDraftTimerTask(){ if (draftTim ...
- 10.1综合强化刷题 Day2 morning
一道图论神题(god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有 ...
- 用pid 取主窗口 hwnd
HWND GetHwndByPid(DWORD dwProcessID) { HWND h = GetTopWindow(); HWND retHwnd = NULL; while ( h ) { D ...
- workflow engine Ruote初体验之一(概念)
由于最近自己写点小东西,需要有工作流程管理方面的应用,所有的环境为Ruby on rails,所有在选择流程引擎的时候选择了ruote,但是对于ruote是完全陌生的,所以在这里记下点滴,如果理解的不 ...
- workflow engine Ruote 安装
今天在安装gem安装Ruote的过程中遇到问题,改用bundle安装: steven@steven-Latitude-D630:/usr$ sudo mkdir bundel [sudo] passw ...
- softmax函数python实现
import numpy as np def softmax(x): """ 对输入x的每一行计算softmax. 该函数对于输入是向量(将向量视为单独的行)或者矩阵(M ...